// vite.config.mts
import path2 from "path";
import vue from "file:///G:/project/image-number-player-admin/node_modules/@vitejs/plugin-vue/dist/index.mjs";
import vueJsx from "file:///G:/project/image-number-player-admin/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs";
import compression from "file:///G:/project/image-number-player-admin/node_modules/vite-plugin-compression/dist/index.mjs";
import { visualizer } from "file:///G:/project/image-number-player-admin/node_modules/rollup-plugin-visualizer/dist/plugin/index.js";

// src/config/proxy.ts
var proxy = {
  "/dev/": {
    target: "http://127.0.0.1:9524",
    changeOrigin: true,
    rewrite: (path3) => path3.replace(/^\/dev/, "")
  },
  "/prod/": {
    target: "https://www.hd0810.com",
    changeOrigin: true,
    rewrite: (path3) => path3.replace(/^\/prod/, "/api")
  }
};

// build/cool/svg/index.ts
import { readFileSync, readdirSync } from "fs";
import { extname } from "path";
function findFiles(dir) {
  const res = [];
  const dirs = readdirSync(dir, {
    withFileTypes: true
  });
  for (const d of dirs) {
    if (d.isDirectory()) {
      res.push(...findFiles(dir + d.name + "/"));
    } else {
      if (extname(d.name) == ".svg") {
        const svg = readFileSync(dir + d.name).toString().replace(/(\r)|(\n)/g, "").replace(/<svg([^>+].*?)>/, (_, $2) => {
          let width = 0;
          let height = 0;
          let content = $2.replace(
            /(width|height)="([^>+].*?)"/g,
            (_2, s2, s3) => {
              if (s2 === "width") {
                width = s3;
              } else if (s2 === "height") {
                height = s3;
              }
              return "";
            }
          );
          if (!/(viewBox="[^>+].*?")/g.test($2)) {
            content += `viewBox="0 0 ${width} ${height}"`;
          }
          return `<symbol id="icon-${d.name.replace(".svg", "")}" ${content}>`;
        }).replace("</svg>", "</symbol>");
        res.push(svg);
      }
    }
  }
  return res;
}
function createSvg(html) {
  const res = findFiles("./src/");
  return html.replace(
    "<body>",
    `<body>
			<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0">
				${res.join("")}
			</svg>`
  );
}

// build/cool/tag/index.ts
import { parse, compileScript } from "file:///G:/project/image-number-player-admin/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js";
import magicString from "file:///G:/project/image-number-player-admin/node_modules/magic-string/dist/magic-string.es.mjs";
function createTag(code, id) {
  if (/\.vue$/.test(id)) {
    let s;
    const str = () => s || (s = new magicString(code));
    const { descriptor } = parse(code);
    if (!descriptor.script && descriptor.scriptSetup) {
      const res = compileScript(descriptor, { id });
      const { name, lang } = res.attrs;
      str().appendLeft(
        0,
        `<script lang="${lang}">
					import { defineComponent } from 'vue'
					export default defineComponent({
						name: "${name}"
					})
				</script>`
      );
      return {
        map: str().generateMap(),
        code: str().toString()
      };
    }
  }
  return null;
}

// build/cool/utils/index.ts
import fs from "fs";
import { join } from "path";
import dayjs from "file:///G:/project/image-number-player-admin/node_modules/dayjs/dayjs.min.js";
function firstUpperCase(value) {
  return value.replace(/\b(\w)(\w*)/g, function($0, $1, $2) {
    return $1.toUpperCase() + $2;
  });
}
function toCamel(str) {
  return str.replace(/([^-])(?:-+([^-]))/g, function($0, $1, $2) {
    return $1 + $2.toUpperCase();
  });
}
function createDir(path3) {
  if (!fs.existsSync(path3))
    fs.mkdirSync(path3);
}
function readFile(name) {
  try {
    return fs.readFileSync(name, "utf8");
  } catch (e) {
  }
  return "";
}
function parseJson(req) {
  return new Promise((resolve2) => {
    let d = "";
    req.on("data", function(chunk) {
      d += chunk;
    });
    req.on("end", function() {
      try {
        resolve2(JSON.parse(d));
      } catch {
        resolve2({});
      }
    });
  });
}
function mkdirs(path3) {
  const arr = path3.split("/");
  let p = "";
  arr.forEach((e) => {
    const t = join(p, e);
    try {
      fs.statSync(t);
    } catch (err) {
      try {
        fs.mkdirSync(t);
      } catch (error2) {
        console.error(error2);
      }
    }
    p = t;
  });
  return p;
}
function error(message) {
  console.log("\x1B[31m%s\x1B[0m", `${dayjs().format("HH:mm:ss")} ${message || ""}`);
}

// build/cool/eps/index.ts
import { join as join3 } from "path";

// build/cool/eps/config.ts
import { join as join2 } from "path";
var __vite_injected_original_dirname = "G:\\project\\image-number-player-admin\\build\\cool\\eps";
var DistPath = join2(__vite_injected_original_dirname, "../dist");
var Entity = {
  mapping: [
    // {
    // 	// 自定义匹配
    // 	custom: ({ propertyName, type }) => {
    // 		// 如果没有，返回null或者不返回，则继续遍历其他匹配规则
    // 		return null;
    // 	}
    // },
    {
      type: "string",
      test: ["varchar", "text", "simple-json"]
    },
    {
      type: "string[]",
      test: ["simple-array"]
    },
    {
      type: "Date",
      test: ["datetime", "date"]
    },
    {
      type: "number",
      test: ["tinyint", "int", "decimal"]
    },
    {
      type: "BigInt",
      test: ["bigint"]
    }
  ]
};

// build/cool/eps/index.ts
import axios from "file:///G:/project/image-number-player-admin/node_modules/axios/index.js";
import { isArray, isEmpty, last, merge, unionBy } from "file:///G:/project/image-number-player-admin/node_modules/lodash-es/lodash.js";
import { createWriteStream } from "fs";
import prettier from "file:///G:/project/image-number-player-admin/node_modules/prettier/index.mjs";
function getNames(v) {
  return Object.keys(v).filter((e) => !["namespace", "permission"].includes(e));
}
var service = {};
var list = [];
var localList = [];
async function getData(temps) {
  if (!isEmpty(temps)) {
    localList = (temps || []).map((e) => {
      return {
        ...e,
        isLocal: true
      };
    });
  }
  try {
    list = JSON.parse(readFile(join3(DistPath, "eps.json")) || "[]");
  } catch (err) {
    error(`[eps] ${join3(DistPath, "eps.json")} \u6587\u4EF6\u5F02\u5E38, ${err.message}`);
  }
  const url = proxy["/dev/"].target + "/admin/base/open/eps";
  await axios.get(url, {
    timeout: 5e3
  }).then((res) => {
    const { code, data } = res.data;
    if (code === 1e3) {
      if (!isEmpty(data) && data) {
        merge(list, Object.values(data).flat());
      }
    }
  }).catch(() => {
    error(`[eps] \u540E\u7AEF\u672A\u542F\u52A8 \u279C  ${url}`);
  });
  if (isArray(localList)) {
    localList.forEach((e) => {
      const d = list.find((a) => e.prefix === a.prefix);
      if (d) {
        merge(d, e);
      } else {
        list.push(e);
      }
    });
  }
  list = unionBy(list, "prefix");
}
function createJson() {
  const d = list.filter((e) => !e.isLocal).map((e) => {
    return {
      prefix: e.prefix,
      name: e.name || "",
      api: e.api.map((e2) => {
        return {
          name: e2.name,
          method: e2.method,
          path: e2.path
        };
      })
    };
  });
  createWriteStream(join3(DistPath, "eps.json"), {
    flags: "w"
  }).write(JSON.stringify(d));
}
async function createDescribe({ list: list2, service: service2 }) {
  function getType({ propertyName, type }) {
    for (const map of Entity.mapping) {
      if (map.custom) {
        const resType = map.custom({ propertyName, type });
        if (resType)
          return resType;
      }
      if (map.test) {
        if (map.test.includes(type))
          return map.type;
      }
    }
    return type;
  }
  function createEntity() {
    const t0 = [];
    for (const item of list2) {
      if (!item.name)
        continue;
      const t = [`interface ${item.name} {`];
      for (const col of item.columns || []) {
        t.push("\n");
        t.push("/**\n");
        t.push(` * ${col.comment}
`);
        t.push(" */\n");
        t.push(
          `${col.propertyName}?: ${getType({
            propertyName: col.propertyName,
            type: col.type
          })};`
        );
      }
      t.push("\n");
      t.push("/**\n");
      t.push(` * \u4EFB\u610F\u952E\u503C
`);
      t.push(" */\n");
      t.push(`[key: string]: any;`);
      t.push("}");
      t0.push(t);
    }
    return t0.map((e) => e.join("")).join("\n\n");
  }
  function createDts() {
    const t0 = [];
    const t1 = [
      `
			type json = any;

			type Service = {
				request(options?: {
					url: string;
					method?: "POST" | "GET" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS";
					data?: any;
					params?: any;
					headers?: {
						[key: string]: any;
					},
					timeout?: number;
					proxy?: boolean;
					[key: string]: any;
				}): Promise<any>;
		`
    ];
    function deep(d, k) {
      if (!k)
        k = "";
      for (const i in d) {
        const name = k + toCamel(firstUpperCase(i.replace(/[:]/g, "")));
        if (d[i].namespace) {
          const item = list2.find((e) => (e.prefix || "") === `/${d[i].namespace}`);
          if (item) {
            const t = [`interface ${name} {`];
            t1.push(`${i}: ${name};`);
            if (item.api) {
              const permission = [];
              item.api.forEach((a) => {
                const n = (a.name || last(a.path.split("/")) || "").replace(
                  /[:\/]/g,
                  ""
                );
                if (n) {
                  let q = [];
                  const { parameters = [] } = a.dts || {};
                  parameters.forEach((p) => {
                    if (p.description) {
                      q.push(`
/** ${p.description}  */
`);
                    }
                    if (p.name.includes(":")) {
                      return false;
                    }
                    const a2 = `${p.name}${p.required ? "" : "?"}`;
                    const b = `${p.schema.type || "string"}`;
                    q.push(`"${a2}": ${b},`);
                  });
                  if (isEmpty(q)) {
                    q = ["any"];
                  } else {
                    q.unshift("{");
                    q.push("}");
                  }
                  let res = "";
                  const en = item.name || "any";
                  switch (a.path) {
                    case "/page":
                      res = `
											{
												pagination: { size: number; page: number; total: number; [key: string]: any };
												list: ${en} [];
												[key: string]: any;
											}
										`;
                      break;
                    case "/list":
                      res = `${en} []`;
                      break;
                    case "/info":
                      res = en;
                      break;
                    default:
                      res = "any";
                      break;
                  }
                  t.push("\n");
                  t.push("/**\n");
                  t.push(` * ${a.summary || n}
`);
                  t.push(" */\n");
                  t.push(
                    `"${n}"(data${q.length == 1 ? "?" : ""}: ${q.join(
                      ""
                    )}): Promise<${res}>;`
                  );
                  if (!permission.includes(n)) {
                    permission.push(n);
                  }
                }
              });
              t.push("\n");
              t.push("/**\n");
              t.push(" * \u6743\u9650\u6807\u8BC6\n");
              t.push(" */\n");
              t.push(
                `permission: { ${permission.map((e) => `"${e}": string;`).join("\n")} };`
              );
              t.push("\n");
              t.push("/**\n");
              t.push(" * \u6743\u9650\u72B6\u6001\n");
              t.push(" */\n");
              t.push(
                `_permission: { ${permission.map((e) => `"${e}": boolean;`).join("\n")} };`
              );
              t.push("\n");
              t.push("/**\n");
              t.push(" * \u8BF7\u6C42\n");
              t.push(" */\n");
              t.push(`request: Service['request']`);
            }
            t.push("}");
            t0.push(t);
          }
        } else {
          t1.push(`${i}: {`);
          deep(d[i], name);
          t1.push(`},`);
        }
      }
    }
    deep(service2);
    t1.push("}");
    t0.push(t1);
    return t0.map((e) => e.join("")).join("\n\n");
  }
  const text = `
		declare namespace Eps {
			${createEntity()}
			${createDts()}
		}
	`;
  const content = await prettier.format(text, {
    parser: "typescript",
    useTabs: true,
    tabWidth: 4,
    endOfLine: "lf",
    semi: true,
    singleQuote: false,
    printWidth: 100,
    trailingComma: "none"
  });
  createWriteStream(join3(DistPath, "eps.d.ts"), {
    flags: "w"
  }).write(content);
}
function createService() {
  list.forEach((e) => {
    const arr = e.prefix.replace(/\//, "").replace("admin", "").split("/").filter(Boolean).map(toCamel);
    function deep(d, i) {
      const k = arr[i];
      if (k) {
        if (arr[i + 1]) {
          if (!d[k]) {
            d[k] = {};
          }
          deep(d[k], i + 1);
        } else {
          if (!d[k]) {
            d[k] = {
              namespace: e.prefix.substring(1, e.prefix.length),
              permission: {}
            };
          }
          e.api.forEach((a) => {
            let n = a.path.replace("/", "");
            if (n) {
              if (n.includes("/:")) {
                a.path = a.path.split("/:")[0];
                n = n.split("/:")[0];
              }
              d[k][n] = a;
            }
          });
          getNames(d[k]).forEach((e2) => {
            d[k].permission[e2] = `${d[k].namespace.replace("admin/", "")}/${e2}`.replace(
              /\//g,
              ":"
            );
          });
        }
      }
    }
    deep(service, 0);
  });
}
async function createEps(query) {
  await getData(query?.list || []);
  createService();
  createDir(DistPath);
  createJson();
  createDescribe({ service, list });
  return {
    service,
    list
  };
}

// build/cool/menu/index.ts
import { createWriteStream as createWriteStream2 } from "fs";
import prettier2 from "file:///G:/project/image-number-player-admin/node_modules/prettier/index.mjs";
import { join as join4 } from "path";
async function createMenu(options) {
  const content = await prettier2.format(options.code, {
    parser: "vue",
    useTabs: true,
    tabWidth: 4,
    endOfLine: "lf",
    semi: true,
    jsxBracketSameLine: true,
    singleQuote: false,
    printWidth: 100,
    trailingComma: "none"
  });
  const dir = (options.viewPath || "").split("/");
  const fname = dir.pop();
  const path3 = mkdirs(`./src/${dir.join("/")}`);
  createWriteStream2(join4(path3, fname || "demo"), {
    flags: "w"
  }).write(content);
}

// build/cool/base.ts
function base() {
  return {
    name: "vite-cool-base",
    enforce: "pre",
    configureServer(server) {
      server.middlewares.use(async (req, res, next) => {
        function done(data) {
          res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" });
          res.end(JSON.stringify(data));
        }
        if (req.url?.includes("__cool")) {
          const body = await parseJson(req);
          switch (req.url) {
            case "/__cool_createMenu":
              await createMenu(body);
              break;
            case "/__cool_eps":
              await createEps(body);
              break;
            default:
              return done({
                code: 1001,
                message: "\u672A\u77E5\u8BF7\u6C42"
              });
          }
          done({
            code: 1e3
          });
        } else {
          next();
        }
      });
    },
    transform(code, id) {
      return createTag(code, id);
    },
    transformIndexHtml(html) {
      return createSvg(html);
    }
  };
}

// build/cool/module/index.ts
import fs2 from "fs";
function createModule() {
  let dirs = [];
  try {
    dirs = fs2.readdirSync("./src/modules");
    dirs = dirs.filter((e) => !e.includes("."));
  } catch (err) {
  }
  return { dirs };
}

// build/cool/virtual.ts
function virtual() {
  const virtualModuleIds = ["virtual:eps", "virtual:module"];
  createEps();
  return {
    name: "vite-cool-virtual",
    enforce: "pre",
    configureServer(server) {
      server.middlewares.use(async (req, res, next) => {
        if (req.url == "/@vite/client") {
          virtualModuleIds.forEach((vm) => {
            const mod = server.moduleGraph.getModuleById(`\0${vm}`);
            if (mod) {
              server.moduleGraph.invalidateModule(mod);
            }
          });
        }
        next();
      });
    },
    async handleHotUpdate({ file, server }) {
      if (!file.includes("build/cool/dist")) {
        const { service: service2 } = await createEps();
        server.ws.send({
          type: "custom",
          event: "eps-update",
          data: {
            service: service2
          }
        });
      }
    },
    resolveId(id) {
      if (virtualModuleIds.includes(id)) {
        return "\0" + id;
      }
    },
    async load(id) {
      if (id === "\0virtual:eps") {
        const { service: service2 } = await createEps();
        return `
					export const eps = ${JSON.stringify({ service: service2 })}
				`;
      }
      if (id === "\0virtual:module") {
        const { dirs } = createModule();
        return `
					export const dirs = ${JSON.stringify(dirs)}
				`;
      }
    }
  };
}

// build/cool/demo.ts
import { glob } from "file:///G:/project/image-number-player-admin/node_modules/glob/dist/esm/index.js";
import path from "path";
import { readFileSync as readFileSync2 } from "fs";
function demo(enable) {
  const virtualModuleIds = ["virtual:demo"];
  return {
    name: "vite-cool-demo",
    enforce: "pre",
    resolveId(id) {
      if (virtualModuleIds.includes(id)) {
        return "\0" + id;
      }
    },
    async load(id) {
      if (id === "\0virtual:demo") {
        const demo2 = {};
        if (enable) {
          const files = await glob("./src/modules/demo/views/crud/components/**", {
            stat: true,
            withFileTypes: true
          });
          for (const file of files) {
            if (file.isFile()) {
              const p = path.join(file.path, file.name);
              demo2[p.replace(/\\/g, "/").split("src/modules/demo/views/crud/components/")[1]] = readFileSync2(p, "utf-8");
            }
          }
        }
        return `
					export const demo = ${JSON.stringify(demo2)};
				`;
      }
    }
  };
}

// build/cool/index.ts
function cool(test) {
  return [
    // 基础
    base(),
    // 虚拟模块
    virtual(),
    // demo 官方示例，代码片段
    demo(test)
  ];
}

// vite.config.mts
var __vite_injected_original_dirname2 = "G:\\project\\image-number-player-admin";
function resolve(dir) {
  return path2.resolve(__vite_injected_original_dirname2, ".", dir);
}
function isDev(mode) {
  return mode === "development";
}
var vite_config_default = ({ mode }) => {
  return {
    plugins: [
      vue(),
      compression(),
      vueJsx(),
      cool(false),
      // 是否测试模式
      visualizer({
        open: false,
        gzipSize: true,
        brotliSize: true
      })
    ],
    base: "/admin/",
    server: {
      port: 9e3,
      proxy,
      hmr: {
        overlay: true
      }
    },
    css: {
      preprocessorOptions: {
        scss: {
          charset: false
        }
      }
    },
    resolve: {
      alias: {
        "/@": resolve("src"),
        "/$": resolve("src/modules"),
        "/#": resolve("src/plugins"),
        "/~": resolve("packages")
      }
    },
    esbuild: {
      drop: isDev(mode) ? [] : ["console", "debugger"]
    },
    build: {
      minify: "esbuild",
      // terserOptions: {
      // 	compress: {
      // 		drop_console: true,
      // 		drop_debugger: true
      // 	}
      // },
      sourcemap: isDev(mode),
      rollupOptions: {
        output: {
          chunkFileNames: "static/js/[name]-[hash].js",
          entryFileNames: "static/js/[name]-[hash].js",
          assetFileNames: "static/[ext]/[name]-[hash].[ext]",
          manualChunks(id) {
            if (id.includes("node_modules")) {
              if (!["@cool-vue/crud"].find((e) => id.includes(e))) {
                let str = id.toString().split("node_modules/")[1];
                if (str[0] == "@") {
                  str = str.replace("/", ".");
                }
                return str.split("/")[0].toString();
              }
            }
          }
        }
      }
    }
  };
};
export {
  vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcubXRzIiwgInNyYy9jb25maWcvcHJveHkudHMiLCAiYnVpbGQvY29vbC9zdmcvaW5kZXgudHMiLCAiYnVpbGQvY29vbC90YWcvaW5kZXgudHMiLCAiYnVpbGQvY29vbC91dGlscy9pbmRleC50cyIsICJidWlsZC9jb29sL2Vwcy9pbmRleC50cyIsICJidWlsZC9jb29sL2Vwcy9jb25maWcudHMiLCAiYnVpbGQvY29vbC9tZW51L2luZGV4LnRzIiwgImJ1aWxkL2Nvb2wvYmFzZS50cyIsICJidWlsZC9jb29sL21vZHVsZS9pbmRleC50cyIsICJidWlsZC9jb29sL3ZpcnR1YWwudHMiLCAiYnVpbGQvY29vbC9kZW1vLnRzIiwgImJ1aWxkL2Nvb2wvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJHOlxcXFxwcm9qZWN0XFxcXGltYWdlLW51bWJlci1wbGF5ZXItYWRtaW5cIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkc6XFxcXHByb2plY3RcXFxcaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pblxcXFx2aXRlLmNvbmZpZy5tdHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0c6L3Byb2plY3QvaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pbi92aXRlLmNvbmZpZy5tdHNcIjtpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQgeyBDb25maWdFbnYsIFVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiO1xyXG5pbXBvcnQgdnVlIGZyb20gXCJAdml0ZWpzL3BsdWdpbi12dWVcIjtcclxuaW1wb3J0IHZ1ZUpzeCBmcm9tIFwiQHZpdGVqcy9wbHVnaW4tdnVlLWpzeFwiO1xyXG5pbXBvcnQgY29tcHJlc3Npb24gZnJvbSBcInZpdGUtcGx1Z2luLWNvbXByZXNzaW9uXCI7XHJcbmltcG9ydCB7IHZpc3VhbGl6ZXIgfSBmcm9tIFwicm9sbHVwLXBsdWdpbi12aXN1YWxpemVyXCI7XHJcbmltcG9ydCB7IHByb3h5IH0gZnJvbSBcIi4vc3JjL2NvbmZpZy9wcm94eVwiO1xyXG5pbXBvcnQgeyBjb29sIH0gZnJvbSBcIi4vYnVpbGQvY29vbFwiO1xyXG5cclxuZnVuY3Rpb24gcmVzb2x2ZShkaXI6IHN0cmluZykge1xyXG5cdHJldHVybiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi5cIiwgZGlyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNEZXYobW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcblx0cmV0dXJuIG1vZGUgPT09IFwiZGV2ZWxvcG1lbnRcIjtcclxufVxyXG5cclxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZ1xyXG5leHBvcnQgZGVmYXVsdCAoeyBtb2RlIH06IENvbmZpZ0Vudik6IFVzZXJDb25maWcgPT4ge1xyXG5cdHJldHVybiB7XHJcblx0XHRwbHVnaW5zOiBbXHJcblx0XHRcdHZ1ZSgpLFxyXG5cdFx0XHRjb21wcmVzc2lvbigpLFxyXG5cdFx0XHR2dWVKc3goKSxcclxuXHRcdFx0Y29vbChmYWxzZSksIC8vIFx1NjYyRlx1NTQyNlx1NkQ0Qlx1OEJENVx1NkEyMVx1NUYwRlxyXG5cdFx0XHR2aXN1YWxpemVyKHtcclxuXHRcdFx0XHRvcGVuOiBmYWxzZSxcclxuXHRcdFx0XHRnemlwU2l6ZTogdHJ1ZSxcclxuXHRcdFx0XHRicm90bGlTaXplOiB0cnVlXHJcblx0XHRcdH0pXHJcblx0XHRdLFxyXG5cdFx0YmFzZTogXCIvYWRtaW4vXCIsXHJcblx0XHRzZXJ2ZXI6IHtcclxuXHRcdFx0cG9ydDogOTAwMCxcclxuXHRcdFx0cHJveHksXHJcblx0XHRcdGhtcjoge1xyXG5cdFx0XHRcdG92ZXJsYXk6IHRydWVcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdGNzczoge1xyXG5cdFx0XHRwcmVwcm9jZXNzb3JPcHRpb25zOiB7XHJcblx0XHRcdFx0c2Nzczoge1xyXG5cdFx0XHRcdFx0Y2hhcnNldDogZmFsc2VcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRyZXNvbHZlOiB7XHJcblx0XHRcdGFsaWFzOiB7XHJcblx0XHRcdFx0XCIvQFwiOiByZXNvbHZlKFwic3JjXCIpLFxyXG5cdFx0XHRcdFwiLyRcIjogcmVzb2x2ZShcInNyYy9tb2R1bGVzXCIpLFxyXG5cdFx0XHRcdFwiLyNcIjogcmVzb2x2ZShcInNyYy9wbHVnaW5zXCIpLFxyXG5cdFx0XHRcdFwiL35cIjogcmVzb2x2ZShcInBhY2thZ2VzXCIpXHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRlc2J1aWxkOiB7XHJcblx0XHRcdGRyb3A6IGlzRGV2KG1vZGUpID8gW10gOiBbXCJjb25zb2xlXCIsIFwiZGVidWdnZXJcIl1cclxuXHRcdH0sXHJcblx0XHRidWlsZDoge1xyXG5cdFx0XHRtaW5pZnk6IFwiZXNidWlsZFwiLFxyXG5cdFx0XHQvLyB0ZXJzZXJPcHRpb25zOiB7XHJcblx0XHRcdC8vIFx0Y29tcHJlc3M6IHtcclxuXHRcdFx0Ly8gXHRcdGRyb3BfY29uc29sZTogdHJ1ZSxcclxuXHRcdFx0Ly8gXHRcdGRyb3BfZGVidWdnZXI6IHRydWVcclxuXHRcdFx0Ly8gXHR9XHJcblx0XHRcdC8vIH0sXHJcblx0XHRcdHNvdXJjZW1hcDogaXNEZXYobW9kZSksXHJcblx0XHRcdHJvbGx1cE9wdGlvbnM6IHtcclxuXHRcdFx0XHRvdXRwdXQ6IHtcclxuXHRcdFx0XHRcdGNodW5rRmlsZU5hbWVzOiBcInN0YXRpYy9qcy9bbmFtZV0tW2hhc2hdLmpzXCIsXHJcblx0XHRcdFx0XHRlbnRyeUZpbGVOYW1lczogXCJzdGF0aWMvanMvW25hbWVdLVtoYXNoXS5qc1wiLFxyXG5cdFx0XHRcdFx0YXNzZXRGaWxlTmFtZXM6IFwic3RhdGljL1tleHRdL1tuYW1lXS1baGFzaF0uW2V4dF1cIixcclxuXHRcdFx0XHRcdG1hbnVhbENodW5rcyhpZCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoaWQuaW5jbHVkZXMoXCJub2RlX21vZHVsZXNcIikpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIVtcIkBjb29sLXZ1ZS9jcnVkXCJdLmZpbmQoKGUpID0+IGlkLmluY2x1ZGVzKGUpKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0bGV0IHN0ciA9IGlkLnRvU3RyaW5nKCkuc3BsaXQoXCJub2RlX21vZHVsZXMvXCIpWzFdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChzdHJbMF0gPT0gXCJAXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RyID0gc3RyLnJlcGxhY2UoXCIvXCIsIFwiLlwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gc3RyLnNwbGl0KFwiL1wiKVswXS50b1N0cmluZygpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcbn07XHJcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXHNyY1xcXFxjb25maWdcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkc6XFxcXHByb2plY3RcXFxcaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pblxcXFxzcmNcXFxcY29uZmlnXFxcXHByb3h5LnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9HOi9wcm9qZWN0L2ltYWdlLW51bWJlci1wbGF5ZXItYWRtaW4vc3JjL2NvbmZpZy9wcm94eS50c1wiO2V4cG9ydCBjb25zdCBwcm94eSA9IHtcblx0XCIvZGV2L1wiOiB7XG5cdFx0dGFyZ2V0OiBcImh0dHA6Ly8xMjcuMC4wLjE6OTUyNFwiLFxuXHRcdGNoYW5nZU9yaWdpbjogdHJ1ZSxcblx0XHRyZXdyaXRlOiAocGF0aDogc3RyaW5nKSA9PiBwYXRoLnJlcGxhY2UoL15cXC9kZXYvLCBcIlwiKVxuXHR9LFxuXG5cdFwiL3Byb2QvXCI6IHtcblx0XHR0YXJnZXQ6IFwiaHR0cHM6Ly93d3cuaGQwODEwLmNvbVwiLFxuXHRcdGNoYW5nZU9yaWdpbjogdHJ1ZSxcblx0XHRyZXdyaXRlOiAocGF0aDogc3RyaW5nKSA9PiBwYXRoLnJlcGxhY2UoL15cXC9wcm9kLywgXCIvYXBpXCIpXG5cdH1cbn07XG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkc6XFxcXHByb2plY3RcXFxcaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pblxcXFxidWlsZFxcXFxjb29sXFxcXHN2Z1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXGJ1aWxkXFxcXGNvb2xcXFxcc3ZnXFxcXGluZGV4LnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9HOi9wcm9qZWN0L2ltYWdlLW51bWJlci1wbGF5ZXItYWRtaW4vYnVpbGQvY29vbC9zdmcvaW5kZXgudHNcIjtpbXBvcnQgeyByZWFkRmlsZVN5bmMsIHJlYWRkaXJTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSBcInBhdGhcIjtcblxuZnVuY3Rpb24gZmluZEZpbGVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCByZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGRpcnMgPSByZWFkZGlyU3luYyhkaXIsIHtcblx0XHR3aXRoRmlsZVR5cGVzOiB0cnVlXG5cdH0pO1xuXHRmb3IgKGNvbnN0IGQgb2YgZGlycykge1xuXHRcdGlmIChkLmlzRGlyZWN0b3J5KCkpIHtcblx0XHRcdHJlcy5wdXNoKC4uLmZpbmRGaWxlcyhkaXIgKyBkLm5hbWUgKyBcIi9cIikpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoZXh0bmFtZShkLm5hbWUpID09IFwiLnN2Z1wiKSB7XG5cdFx0XHRcdGNvbnN0IHN2ZyA9IHJlYWRGaWxlU3luYyhkaXIgKyBkLm5hbWUpXG5cdFx0XHRcdFx0LnRvU3RyaW5nKClcblx0XHRcdFx0XHQucmVwbGFjZSgvKFxccil8KFxcbikvZywgXCJcIilcblx0XHRcdFx0XHQucmVwbGFjZSgvPHN2ZyhbXj4rXS4qPyk+LywgKF86IGFueSwgJDI6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IHdpZHRoID0gMDtcblx0XHRcdFx0XHRcdGxldCBoZWlnaHQgPSAwO1xuXHRcdFx0XHRcdFx0bGV0IGNvbnRlbnQgPSAkMi5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHQvKHdpZHRofGhlaWdodCk9XCIoW14+K10uKj8pXCIvZyxcblx0XHRcdFx0XHRcdFx0KF86IGFueSwgczI6IGFueSwgczM6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzMiA9PT0gXCJ3aWR0aFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR3aWR0aCA9IHMzO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoczIgPT09IFwiaGVpZ2h0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGhlaWdodCA9IHMzO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGlmICghLyh2aWV3Qm94PVwiW14+K10uKj9cIikvZy50ZXN0KCQyKSkge1xuXHRcdFx0XHRcdFx0XHRjb250ZW50ICs9IGB2aWV3Qm94PVwiMCAwICR7d2lkdGh9ICR7aGVpZ2h0fVwiYDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBgPHN5bWJvbCBpZD1cImljb24tJHtkLm5hbWUucmVwbGFjZShcIi5zdmdcIiwgXCJcIil9XCIgJHtjb250ZW50fT5gO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnJlcGxhY2UoXCI8L3N2Zz5cIiwgXCI8L3N5bWJvbD5cIik7XG5cdFx0XHRcdHJlcy5wdXNoKHN2Zyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdmcoaHRtbDogc3RyaW5nKSB7XG5cdGNvbnN0IHJlcyA9IGZpbmRGaWxlcyhcIi4vc3JjL1wiKTtcblxuXHRyZXR1cm4gaHRtbC5yZXBsYWNlKFxuXHRcdFwiPGJvZHk+XCIsXG5cdFx0YDxib2R5PlxuXHRcdFx0PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAwOyBoZWlnaHQ6IDBcIj5cblx0XHRcdFx0JHtyZXMuam9pbihcIlwiKX1cblx0XHRcdDwvc3ZnPmBcblx0KTtcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXGJ1aWxkXFxcXGNvb2xcXFxcdGFnXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJHOlxcXFxwcm9qZWN0XFxcXGltYWdlLW51bWJlci1wbGF5ZXItYWRtaW5cXFxcYnVpbGRcXFxcY29vbFxcXFx0YWdcXFxcaW5kZXgudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0c6L3Byb2plY3QvaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pbi9idWlsZC9jb29sL3RhZy9pbmRleC50c1wiO2ltcG9ydCB7IHBhcnNlLCBjb21waWxlU2NyaXB0IH0gZnJvbSBcIkB2dWUvY29tcGlsZXItc2ZjXCI7XG5pbXBvcnQgbWFnaWNTdHJpbmcgZnJvbSBcIm1hZ2ljLXN0cmluZ1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFnKGNvZGU6IHN0cmluZywgaWQ6IHN0cmluZykge1xuXHRpZiAoL1xcLnZ1ZSQvLnRlc3QoaWQpKSB7XG5cdFx0bGV0IHM6IGFueTtcblx0XHRjb25zdCBzdHIgPSAoKSA9PiBzIHx8IChzID0gbmV3IG1hZ2ljU3RyaW5nKGNvZGUpKTtcblx0XHRjb25zdCB7IGRlc2NyaXB0b3IgfSA9IHBhcnNlKGNvZGUpO1xuXG5cdFx0aWYgKCFkZXNjcmlwdG9yLnNjcmlwdCAmJiBkZXNjcmlwdG9yLnNjcmlwdFNldHVwKSB7XG5cdFx0XHRjb25zdCByZXMgPSBjb21waWxlU2NyaXB0KGRlc2NyaXB0b3IsIHsgaWQgfSk7XG5cdFx0XHRjb25zdCB7IG5hbWUsIGxhbmcgfTogYW55ID0gcmVzLmF0dHJzO1xuXG5cdFx0XHRzdHIoKS5hcHBlbmRMZWZ0KFxuXHRcdFx0XHQwLFxuXHRcdFx0XHRgPHNjcmlwdCBsYW5nPVwiJHtsYW5nfVwiPlxuXHRcdFx0XHRcdGltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gJ3Z1ZSdcblx0XHRcdFx0XHRleHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuXHRcdFx0XHRcdFx0bmFtZTogXCIke25hbWV9XCJcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQ8XFwvc2NyaXB0PmBcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1hcDogc3RyKCkuZ2VuZXJhdGVNYXAoKSxcblx0XHRcdFx0Y29kZTogc3RyKCkudG9TdHJpbmcoKVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXGJ1aWxkXFxcXGNvb2xcXFxcdXRpbHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkc6XFxcXHByb2plY3RcXFxcaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pblxcXFxidWlsZFxcXFxjb29sXFxcXHV0aWxzXFxcXGluZGV4LnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9HOi9wcm9qZWN0L2ltYWdlLW51bWJlci1wbGF5ZXItYWRtaW4vYnVpbGQvY29vbC91dGlscy9pbmRleC50c1wiO2ltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xuXG4vLyBcdTk5OTZcdTVCNTdcdTZCQ0RcdTU5MjdcdTUxOTlcbmV4cG9ydCBmdW5jdGlvbiBmaXJzdFVwcGVyQ2FzZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcYihcXHcpKFxcdyopL2csIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG5cdFx0cmV0dXJuICQxLnRvVXBwZXJDYXNlKCkgKyAkMjtcblx0fSk7XG59XG5cbi8vIFx1NkEyQVx1Njc2MFx1OEY2Q1x1OUE3Q1x1NUNGMFxuZXhwb3J0IGZ1bmN0aW9uIHRvQ2FtZWwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gc3RyLnJlcGxhY2UoLyhbXi1dKSg/Oi0rKFteLV0pKS9nLCBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuXHRcdHJldHVybiAkMSArICQyLnRvVXBwZXJDYXNlKCk7XG5cdH0pO1xufVxuXG4vLyBcdTUyMUJcdTVFRkFcdTc2RUVcdTVGNTVcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXIocGF0aDogc3RyaW5nKSB7XG5cdGlmICghZnMuZXhpc3RzU3luYyhwYXRoKSkgZnMubWtkaXJTeW5jKHBhdGgpO1xufVxuXG4vLyBcdThCRkJcdTUzRDZcdTY1ODdcdTRFRjZcbmV4cG9ydCBmdW5jdGlvbiByZWFkRmlsZShuYW1lOiBzdHJpbmcpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZnMucmVhZEZpbGVTeW5jKG5hbWUsIFwidXRmOFwiKTtcblx0fSBjYXRjaCAoZSkge31cblxuXHRyZXR1cm4gXCJcIjtcbn1cblxuLy8gXHU4OUUzXHU2NzkwYm9keVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSnNvbihyZXE6IGFueSk6IFByb21pc2U8YW55PiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdGxldCBkID0gXCJcIjtcblx0XHRyZXEub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChjaHVuazogQnVmZmVyKSB7XG5cdFx0XHRkICs9IGNodW5rO1xuXHRcdH0pO1xuXHRcdHJlcS5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXNvbHZlKEpTT04ucGFyc2UoZCkpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdHJlc29sdmUoe30pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcbn1cblxuLy8gXHU2REYxXHU1RUE2XHU1MjFCXHU1RUZBXHU3NkVFXHU1RjU1XG5leHBvcnQgZnVuY3Rpb24gbWtkaXJzKHBhdGg6IHN0cmluZykge1xuXHRjb25zdCBhcnIgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IHAgPSBcIlwiO1xuXG5cdGFyci5mb3JFYWNoKChlKSA9PiB7XG5cdFx0Y29uc3QgdCA9IGpvaW4ocCwgZSk7XG5cblx0XHR0cnkge1xuXHRcdFx0ZnMuc3RhdFN5bmModCk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRmcy5ta2RpclN5bmModCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cCA9IHQ7XG5cdH0pO1xuXG5cdHJldHVybiBwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdGNvbnNvbGUubG9nKFwiXFx4MUJbMzFtJXNcXHgxQlswbVwiLCBgJHtkYXlqcygpLmZvcm1hdChcIkhIOm1tOnNzXCIpfSAke21lc3NhZ2UgfHwgXCJcIn1gKTtcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXGJ1aWxkXFxcXGNvb2xcXFxcZXBzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJHOlxcXFxwcm9qZWN0XFxcXGltYWdlLW51bWJlci1wbGF5ZXItYWRtaW5cXFxcYnVpbGRcXFxcY29vbFxcXFxlcHNcXFxcaW5kZXgudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0c6L3Byb2plY3QvaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pbi9idWlsZC9jb29sL2Vwcy9pbmRleC50c1wiO2ltcG9ydCB7IGNyZWF0ZURpciwgZXJyb3IsIGZpcnN0VXBwZXJDYXNlLCByZWFkRmlsZSwgdG9DYW1lbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBFbnRpdHksIERpc3RQYXRoIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBpc0FycmF5LCBpc0VtcHR5LCBsYXN0LCBtZXJnZSwgdW5pb25CeSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVdyaXRlU3RyZWFtIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgcHJldHRpZXIgZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBwcm94eSB9IGZyb20gXCIuLi8uLi8uLi9zcmMvY29uZmlnL3Byb3h5XCI7XG5pbXBvcnQgdHlwZSB7IEVwcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vLyBcdTgzQjdcdTUzRDZcdTY1QjlcdTZDRDVcdTU0MERcbmZ1bmN0aW9uIGdldE5hbWVzKHY6IGFueSkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXModikuZmlsdGVyKChlKSA9PiAhW1wibmFtZXNwYWNlXCIsIFwicGVybWlzc2lvblwiXS5pbmNsdWRlcyhlKSk7XG59XG5cbi8vIFx1NjU3MFx1NjM2RVxuY29uc3Qgc2VydmljZSA9IHt9O1xubGV0IGxpc3Q6IEVwcy5FbnRpdHlbXSA9IFtdO1xubGV0IGxvY2FsTGlzdDogRXBzLkVudGl0eVtdID0gW107XG5cbi8vIFx1ODNCN1x1NTNENlx1NjU3MFx1NjM2RVxuYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YSh0ZW1wcz86IEVwcy5FbnRpdHlbXSkge1xuXHQvLyBcdThCQjBcdTVGNTVcdTY3MkNcdTU3MzBcdTY1NzBcdTYzNkVcblx0aWYgKCFpc0VtcHR5KHRlbXBzKSkge1xuXHRcdGxvY2FsTGlzdCA9ICh0ZW1wcyB8fCBbXSkubWFwKChlKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHQuLi5lLFxuXHRcdFx0XHRpc0xvY2FsOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gXHU2NzJDXHU1NzMwXHU2NTg3XHU0RUY2XG5cdHRyeSB7XG5cdFx0bGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoam9pbihEaXN0UGF0aCwgXCJlcHMuanNvblwiKSkgfHwgXCJbXVwiKTtcblx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRlcnJvcihgW2Vwc10gJHtqb2luKERpc3RQYXRoLCBcImVwcy5qc29uXCIpfSBcdTY1ODdcdTRFRjZcdTVGMDJcdTVFMzgsICR7ZXJyLm1lc3NhZ2V9YCk7XG5cdH1cblxuXHQvLyBcdThGRENcdTdBMEJcdTU3MzBcdTU3NDBcblx0Y29uc3QgdXJsID0gcHJveHlbXCIvZGV2L1wiXS50YXJnZXQgKyBcIi9hZG1pbi9iYXNlL29wZW4vZXBzXCI7XG5cblx0Ly8gXHU4QkY3XHU2QzQyXHU2NTcwXHU2MzZFXG5cdGF3YWl0IGF4aW9zXG5cdFx0LmdldCh1cmwsIHtcblx0XHRcdHRpbWVvdXQ6IDUwMDBcblx0XHR9KVxuXHRcdC50aGVuKChyZXMpID0+IHtcblx0XHRcdGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gcmVzLmRhdGE7XG5cblx0XHRcdGlmIChjb2RlID09PSAxMDAwKSB7XG5cdFx0XHRcdGlmICghaXNFbXB0eShkYXRhKSAmJiBkYXRhKSB7XG5cdFx0XHRcdFx0bWVyZ2UobGlzdCwgT2JqZWN0LnZhbHVlcyhkYXRhKS5mbGF0KCkgYXMgRXBzLkVudGl0eVtdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pXG5cdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdGVycm9yKGBbZXBzXSBcdTU0MEVcdTdBRUZcdTY3MkFcdTU0MkZcdTUyQTggXHUyNzlDICAke3VybH1gKTtcblx0XHR9KTtcblxuXHQvLyBcdTU0MDhcdTVFNzZcdTY3MkNcdTU3MzBcdTY1NzBcdTYzNkVcblx0aWYgKGlzQXJyYXkobG9jYWxMaXN0KSkge1xuXHRcdGxvY2FsTGlzdC5mb3JFYWNoKChlKSA9PiB7XG5cdFx0XHRjb25zdCBkID0gbGlzdC5maW5kKChhKSA9PiBlLnByZWZpeCA9PT0gYS5wcmVmaXgpO1xuXG5cdFx0XHRpZiAoZCkge1xuXHRcdFx0XHRtZXJnZShkLCBlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxpc3QucHVzaChlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGxpc3QgPSB1bmlvbkJ5KGxpc3QsIFwicHJlZml4XCIpO1xufVxuXG4vLyBcdTUyMUJcdTVFRkEganNvbiBcdTY1ODdcdTRFRjZcbmZ1bmN0aW9uIGNyZWF0ZUpzb24oKSB7XG5cdGNvbnN0IGQgPSBsaXN0XG5cdFx0LmZpbHRlcigoZSkgPT4gIWUuaXNMb2NhbClcblx0XHQubWFwKChlKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRwcmVmaXg6IGUucHJlZml4LFxuXHRcdFx0XHRuYW1lOiBlLm5hbWUgfHwgXCJcIixcblx0XHRcdFx0YXBpOiBlLmFwaS5tYXAoKGUpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0bmFtZTogZS5uYW1lLFxuXHRcdFx0XHRcdFx0bWV0aG9kOiBlLm1ldGhvZCxcblx0XHRcdFx0XHRcdHBhdGg6IGUucGF0aFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0pXG5cdFx0XHR9O1xuXHRcdH0pO1xuXG5cdGNyZWF0ZVdyaXRlU3RyZWFtKGpvaW4oRGlzdFBhdGgsIFwiZXBzLmpzb25cIiksIHtcblx0XHRmbGFnczogXCJ3XCJcblx0fSkud3JpdGUoSlNPTi5zdHJpbmdpZnkoZCkpO1xufVxuXG4vLyBcdTUyMUJcdTVFRkFcdTYzQ0ZcdThGRjBcdTY1ODdcdTRFRjZcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlc2NyaWJlKHsgbGlzdCwgc2VydmljZSB9OiB7IGxpc3Q6IEVwcy5FbnRpdHlbXTsgc2VydmljZTogYW55IH0pIHtcblx0Ly8gXHU4M0I3XHU1M0Q2XHU3QzdCXHU1NzhCXG5cdGZ1bmN0aW9uIGdldFR5cGUoeyBwcm9wZXJ0eU5hbWUsIHR5cGUgfTogYW55KSB7XG5cdFx0Zm9yIChjb25zdCBtYXAgb2YgRW50aXR5Lm1hcHBpbmcpIHtcblx0XHRcdGlmIChtYXAuY3VzdG9tKSB7XG5cdFx0XHRcdGNvbnN0IHJlc1R5cGUgPSBtYXAuY3VzdG9tKHsgcHJvcGVydHlOYW1lLCB0eXBlIH0pO1xuXHRcdFx0XHRpZiAocmVzVHlwZSkgcmV0dXJuIHJlc1R5cGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAobWFwLnRlc3QpIHtcblx0XHRcdFx0aWYgKG1hcC50ZXN0LmluY2x1ZGVzKHR5cGUpKSByZXR1cm4gbWFwLnR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0eXBlO1xuXHR9XG5cblx0Ly8gXHU1MjFCXHU1RUZBIEVudGl0eVxuXHRmdW5jdGlvbiBjcmVhdGVFbnRpdHkoKSB7XG5cdFx0Y29uc3QgdDA6IHN0cmluZ1tdW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbSBvZiBsaXN0KSB7XG5cdFx0XHRpZiAoIWl0ZW0ubmFtZSkgY29udGludWU7XG5cdFx0XHRjb25zdCB0ID0gW2BpbnRlcmZhY2UgJHtpdGVtLm5hbWV9IHtgXTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2wgb2YgaXRlbS5jb2x1bW5zIHx8IFtdKSB7XG5cdFx0XHRcdC8vIFx1NjNDRlx1OEZGMFxuXHRcdFx0XHR0LnB1c2goXCJcXG5cIik7XG5cdFx0XHRcdHQucHVzaChcIi8qKlxcblwiKTtcblx0XHRcdFx0dC5wdXNoKGAgKiAke2NvbC5jb21tZW50fVxcbmApO1xuXHRcdFx0XHR0LnB1c2goXCIgKi9cXG5cIik7XG5cdFx0XHRcdHQucHVzaChcblx0XHRcdFx0XHRgJHtjb2wucHJvcGVydHlOYW1lfT86ICR7Z2V0VHlwZSh7XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eU5hbWU6IGNvbC5wcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdFx0XHR0eXBlOiBjb2wudHlwZVxuXHRcdFx0XHRcdH0pfTtgXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHR0LnB1c2goXCJcXG5cIik7XG5cdFx0XHR0LnB1c2goXCIvKipcXG5cIik7XG5cdFx0XHR0LnB1c2goYCAqIFx1NEVGQlx1NjEwRlx1OTUyRVx1NTAzQ1xcbmApO1xuXHRcdFx0dC5wdXNoKFwiICovXFxuXCIpO1xuXHRcdFx0dC5wdXNoKGBba2V5OiBzdHJpbmddOiBhbnk7YCk7XG5cdFx0XHR0LnB1c2goXCJ9XCIpO1xuXHRcdFx0dDAucHVzaCh0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdDAubWFwKChlKSA9PiBlLmpvaW4oXCJcIikpLmpvaW4oXCJcXG5cXG5cIik7XG5cdH1cblxuXHQvLyBcdTUyMUJcdTVFRkEgU2VydmljZVxuXHRmdW5jdGlvbiBjcmVhdGVEdHMoKSB7XG5cdFx0Y29uc3QgdDA6IHN0cmluZ1tdW10gPSBbXTtcblxuXHRcdGNvbnN0IHQxID0gW1xuXHRcdFx0YFxuXHRcdFx0dHlwZSBqc29uID0gYW55O1xuXG5cdFx0XHR0eXBlIFNlcnZpY2UgPSB7XG5cdFx0XHRcdHJlcXVlc3Qob3B0aW9ucz86IHtcblx0XHRcdFx0XHR1cmw6IHN0cmluZztcblx0XHRcdFx0XHRtZXRob2Q/OiBcIlBPU1RcIiB8IFwiR0VUXCIgfCBcIlBVVFwiIHwgXCJERUxFVEVcIiB8IFwiUEFUQ0hcIiB8IFwiSEVBRFwiIHwgXCJPUFRJT05TXCI7XG5cdFx0XHRcdFx0ZGF0YT86IGFueTtcblx0XHRcdFx0XHRwYXJhbXM/OiBhbnk7XG5cdFx0XHRcdFx0aGVhZGVycz86IHtcblx0XHRcdFx0XHRcdFtrZXk6IHN0cmluZ106IGFueTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRpbWVvdXQ/OiBudW1iZXI7XG5cdFx0XHRcdFx0cHJveHk/OiBib29sZWFuO1xuXHRcdFx0XHRcdFtrZXk6IHN0cmluZ106IGFueTtcblx0XHRcdFx0fSk6IFByb21pc2U8YW55Pjtcblx0XHRgXG5cdFx0XTtcblxuXHRcdC8vIFx1NTkwNFx1NzQwNlx1NjU3MFx1NjM2RVxuXHRcdGZ1bmN0aW9uIGRlZXAoZDogYW55LCBrPzogc3RyaW5nKSB7XG5cdFx0XHRpZiAoIWspIGsgPSBcIlwiO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGkgaW4gZCkge1xuXHRcdFx0XHRjb25zdCBuYW1lID0gayArIHRvQ2FtZWwoZmlyc3RVcHBlckNhc2UoaS5yZXBsYWNlKC9bOl0vZywgXCJcIikpKTtcblxuXHRcdFx0XHRpZiAoZFtpXS5uYW1lc3BhY2UpIHtcblx0XHRcdFx0XHQvLyBcdTY3RTVcdTYyN0VcdTkxNERcdTdGNkVcblx0XHRcdFx0XHRjb25zdCBpdGVtID0gbGlzdC5maW5kKChlKSA9PiAoZS5wcmVmaXggfHwgXCJcIikgPT09IGAvJHtkW2ldLm5hbWVzcGFjZX1gKTtcblxuXHRcdFx0XHRcdGlmIChpdGVtKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0ID0gW2BpbnRlcmZhY2UgJHtuYW1lfSB7YF07XG5cblx0XHRcdFx0XHRcdHQxLnB1c2goYCR7aX06ICR7bmFtZX07YCk7XG5cblx0XHRcdFx0XHRcdC8vIFx1NjNEMlx1NTE2NVx1NjVCOVx1NkNENVxuXHRcdFx0XHRcdFx0aWYgKGl0ZW0uYXBpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFx1Njc0M1x1OTY1MFx1NTIxN1x1ODg2OFxuXHRcdFx0XHRcdFx0XHRjb25zdCBwZXJtaXNzaW9uOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdGl0ZW0uYXBpLmZvckVhY2goKGEpID0+IHtcblx0XHRcdFx0XHRcdFx0XHQvLyBcdTY1QjlcdTZDRDVcdTU0MERcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuID0gKGEubmFtZSB8fCBsYXN0KGEucGF0aC5zcGxpdChcIi9cIikpIHx8IFwiXCIpLnJlcGxhY2UoXG5cdFx0XHRcdFx0XHRcdFx0XHQvWzpcXC9dL2csXG5cdFx0XHRcdFx0XHRcdFx0XHRcIlwiXG5cdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChuKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBcdTUzQzJcdTY1NzBcdTdDN0JcdTU3OEJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBxOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBcdTUzQzJcdTY1NzBcdTUyMTdcdTg4Njhcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBhLmR0cyB8fCB7fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1ldGVycy5mb3JFYWNoKChwKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwLmRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cS5wdXNoKGBcXG4vKiogJHtwLmRlc2NyaXB0aW9ufSAgKi9cXG5gKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwLm5hbWUuaW5jbHVkZXMoXCI6XCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYSA9IGAke3AubmFtZX0ke3AucmVxdWlyZWQgPyBcIlwiIDogXCI/XCJ9YDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYiA9IGAke3Auc2NoZW1hLnR5cGUgfHwgXCJzdHJpbmdcIn1gO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHEucHVzaChgXCIke2F9XCI6ICR7Yn0sYCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGlzRW1wdHkocSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cSA9IFtcImFueVwiXTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHEudW5zaGlmdChcIntcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHEucHVzaChcIn1cIik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFx1OEZENFx1NTZERVx1N0M3Qlx1NTc4QlxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJlcyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFx1NUI5RVx1NEY1M1x1NTQwRFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZW4gPSBpdGVtLm5hbWUgfHwgXCJhbnlcIjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0c3dpdGNoIChhLnBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9wYWdlXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzID0gYFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhZ2luYXRpb246IHsgc2l6ZTogbnVtYmVyOyBwYWdlOiBudW1iZXI7IHRvdGFsOiBudW1iZXI7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGlzdDogJHtlbn0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRba2V5OiBzdHJpbmddOiBhbnk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRgO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvbGlzdFwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlcyA9IGAke2VufSBbXWA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9pbmZvXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzID0gZW47XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXMgPSBcImFueVwiO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBcdTYzQ0ZcdThGRjBcblx0XHRcdFx0XHRcdFx0XHRcdHQucHVzaChcIlxcblwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdHQucHVzaChcIi8qKlxcblwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdHQucHVzaChgICogJHthLnN1bW1hcnkgfHwgbn1cXG5gKTtcblx0XHRcdFx0XHRcdFx0XHRcdHQucHVzaChcIiAqL1xcblwiKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0dC5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRgXCIke259XCIoZGF0YSR7cS5sZW5ndGggPT0gMSA/IFwiP1wiIDogXCJcIn06ICR7cS5qb2luKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KX0pOiBQcm9taXNlPCR7cmVzfT47YFxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFwZXJtaXNzaW9uLmluY2x1ZGVzKG4pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBlcm1pc3Npb24ucHVzaChuKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFx1Njc0M1x1OTY1MFx1NjgwN1x1OEJDNlxuXHRcdFx0XHRcdFx0XHR0LnB1c2goXCJcXG5cIik7XG5cdFx0XHRcdFx0XHRcdHQucHVzaChcIi8qKlxcblwiKTtcblx0XHRcdFx0XHRcdFx0dC5wdXNoKFwiICogXHU2NzQzXHU5NjUwXHU2ODA3XHU4QkM2XFxuXCIpO1xuXHRcdFx0XHRcdFx0XHR0LnB1c2goXCIgKi9cXG5cIik7XG5cdFx0XHRcdFx0XHRcdHQucHVzaChcblx0XHRcdFx0XHRcdFx0XHRgcGVybWlzc2lvbjogeyAke3Blcm1pc3Npb25cblx0XHRcdFx0XHRcdFx0XHRcdC5tYXAoKGUpID0+IGBcIiR7ZX1cIjogc3RyaW5nO2ApXG5cdFx0XHRcdFx0XHRcdFx0XHQuam9pbihcIlxcblwiKX0gfTtgXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gXHU2NzQzXHU5NjUwXHU3MkI2XHU2MDAxXG5cdFx0XHRcdFx0XHRcdHQucHVzaChcIlxcblwiKTtcblx0XHRcdFx0XHRcdFx0dC5wdXNoKFwiLyoqXFxuXCIpO1xuXHRcdFx0XHRcdFx0XHR0LnB1c2goXCIgKiBcdTY3NDNcdTk2NTBcdTcyQjZcdTYwMDFcXG5cIik7XG5cdFx0XHRcdFx0XHRcdHQucHVzaChcIiAqL1xcblwiKTtcblx0XHRcdFx0XHRcdFx0dC5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdGBfcGVybWlzc2lvbjogeyAke3Blcm1pc3Npb25cblx0XHRcdFx0XHRcdFx0XHRcdC5tYXAoKGUpID0+IGBcIiR7ZX1cIjogYm9vbGVhbjtgKVxuXHRcdFx0XHRcdFx0XHRcdFx0LmpvaW4oXCJcXG5cIil9IH07YFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFx1OEJGN1x1NkM0MlxuXHRcdFx0XHRcdFx0XHR0LnB1c2goXCJcXG5cIik7XG5cdFx0XHRcdFx0XHRcdHQucHVzaChcIi8qKlxcblwiKTtcblx0XHRcdFx0XHRcdFx0dC5wdXNoKFwiICogXHU4QkY3XHU2QzQyXFxuXCIpO1xuXHRcdFx0XHRcdFx0XHR0LnB1c2goXCIgKi9cXG5cIik7XG5cdFx0XHRcdFx0XHRcdHQucHVzaChgcmVxdWVzdDogU2VydmljZVsncmVxdWVzdCddYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHQucHVzaChcIn1cIik7XG5cdFx0XHRcdFx0XHR0MC5wdXNoKHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0MS5wdXNoKGAke2l9OiB7YCk7XG5cdFx0XHRcdFx0ZGVlcChkW2ldLCBuYW1lKTtcblx0XHRcdFx0XHR0MS5wdXNoKGB9LGApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gXHU2REYxXHU1RUE2XG5cdFx0ZGVlcChzZXJ2aWNlKTtcblxuXHRcdC8vIFx1N0VEM1x1Njc1RlxuXHRcdHQxLnB1c2goXCJ9XCIpO1xuXG5cdFx0Ly8gXHU4RkZEXHU1MkEwXG5cdFx0dDAucHVzaCh0MSk7XG5cblx0XHRyZXR1cm4gdDAubWFwKChlKSA9PiBlLmpvaW4oXCJcIikpLmpvaW4oXCJcXG5cXG5cIik7XG5cdH1cblxuXHQvLyBcdTY1ODdcdTRFRjZcdTUxODVcdTVCQjlcblx0Y29uc3QgdGV4dCA9IGBcblx0XHRkZWNsYXJlIG5hbWVzcGFjZSBFcHMge1xuXHRcdFx0JHtjcmVhdGVFbnRpdHkoKX1cblx0XHRcdCR7Y3JlYXRlRHRzKCl9XG5cdFx0fVxuXHRgO1xuXG5cdC8vIFx1NjU4N1x1NjcyQ1x1NTE4NVx1NUJCOVxuXHRjb25zdCBjb250ZW50ID0gYXdhaXQgcHJldHRpZXIuZm9ybWF0KHRleHQsIHtcblx0XHRwYXJzZXI6IFwidHlwZXNjcmlwdFwiLFxuXHRcdHVzZVRhYnM6IHRydWUsXG5cdFx0dGFiV2lkdGg6IDQsXG5cdFx0ZW5kT2ZMaW5lOiBcImxmXCIsXG5cdFx0c2VtaTogdHJ1ZSxcblx0XHRzaW5nbGVRdW90ZTogZmFsc2UsXG5cdFx0cHJpbnRXaWR0aDogMTAwLFxuXHRcdHRyYWlsaW5nQ29tbWE6IFwibm9uZVwiXG5cdH0pO1xuXG5cdC8vIFx1NTIxQlx1NUVGQSBlcHMgXHU2M0NGXHU4RkYwXHU2NTg3XHU0RUY2XG5cdGNyZWF0ZVdyaXRlU3RyZWFtKGpvaW4oRGlzdFBhdGgsIFwiZXBzLmQudHNcIiksIHtcblx0XHRmbGFnczogXCJ3XCJcblx0fSkud3JpdGUoY29udGVudCk7XG59XG5cbi8vIFx1NTIxQlx1NUVGQSBzZXJ2aWNlXG5mdW5jdGlvbiBjcmVhdGVTZXJ2aWNlKCkge1xuXHRsaXN0LmZvckVhY2goKGUpID0+IHtcblx0XHQvLyBcdTUyMDZcdTk2OTRcdThERUZcdTVGODRcblx0XHRjb25zdCBhcnIgPSBlLnByZWZpeFxuXHRcdFx0LnJlcGxhY2UoL1xcLy8sIFwiXCIpXG5cdFx0XHQucmVwbGFjZShcImFkbWluXCIsIFwiXCIpXG5cdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0XHQubWFwKHRvQ2FtZWwpO1xuXG5cdFx0Ly8gXHU5MDREXHU1Mzg2XG5cdFx0ZnVuY3Rpb24gZGVlcChkOiBhbnksIGk6IG51bWJlcikge1xuXHRcdFx0Y29uc3QgayA9IGFycltpXTtcblxuXHRcdFx0aWYgKGspIHtcblx0XHRcdFx0Ly8gXHU2NjJGXHU1NDI2XHU2NzAwXHU1NDBFXHU0RTAwXHU0RTJBXG5cdFx0XHRcdGlmIChhcnJbaSArIDFdKSB7XG5cdFx0XHRcdFx0aWYgKCFkW2tdKSB7XG5cdFx0XHRcdFx0XHRkW2tdID0ge307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZGVlcChkW2tdLCBpICsgMSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gXHU0RTBEXHU1QjU4XHU1NzI4XHU1MjE5XHU1MjFCXHU1RUZBXG5cdFx0XHRcdFx0aWYgKCFkW2tdKSB7XG5cdFx0XHRcdFx0XHRkW2tdID0ge1xuXHRcdFx0XHRcdFx0XHRuYW1lc3BhY2U6IGUucHJlZml4LnN1YnN0cmluZygxLCBlLnByZWZpeC5sZW5ndGgpLFxuXHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9uOiB7fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBcdTUyMUJcdTVFRkFcdTY1QjlcdTZDRDVcblx0XHRcdFx0XHRlLmFwaS5mb3JFYWNoKChhKSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBcdTY1QjlcdTZDRDVcdTU0MERcblx0XHRcdFx0XHRcdGxldCBuID0gYS5wYXRoLnJlcGxhY2UoXCIvXCIsIFwiXCIpO1xuXG5cdFx0XHRcdFx0XHRpZiAobikge1xuXHRcdFx0XHRcdFx0XHQvLyBcdTc5M0FcdTRGOEIgL2luZm8vOmlkXG5cdFx0XHRcdFx0XHRcdGlmIChuLmluY2x1ZGVzKFwiLzpcIikpIHtcblx0XHRcdFx0XHRcdFx0XHRhLnBhdGggPSBhLnBhdGguc3BsaXQoXCIvOlwiKVswXTtcblx0XHRcdFx0XHRcdFx0XHRuID0gbi5zcGxpdChcIi86XCIpWzBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0ZFtrXVtuXSA9IGE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHQvLyBcdTUyMUJcdTVFRkFcdTY3NDNcdTk2NTBcblx0XHRcdFx0XHRnZXROYW1lcyhkW2tdKS5mb3JFYWNoKChlKSA9PiB7XG5cdFx0XHRcdFx0XHRkW2tdLnBlcm1pc3Npb25bZV0gPSBgJHtkW2tdLm5hbWVzcGFjZS5yZXBsYWNlKFwiYWRtaW4vXCIsIFwiXCIpfS8ke2V9YC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHQvXFwvL2csXG5cdFx0XHRcdFx0XHRcdFwiOlwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZGVlcChzZXJ2aWNlLCAwKTtcblx0fSk7XG59XG5cbi8vIFx1NTIxQlx1NUVGQSBlcHNcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVFcHMocXVlcnk/OiB7IGxpc3Q6IGFueVtdIH0pIHtcblx0Ly8gXHU4M0I3XHU1M0Q2XHU2NTcwXHU2MzZFXG5cdGF3YWl0IGdldERhdGEocXVlcnk/Lmxpc3QgfHwgW10pO1xuXG5cdC8vIFx1NTIxQlx1NUVGQSBzZXJ2aWNlXG5cdGNyZWF0ZVNlcnZpY2UoKTtcblxuXHQvLyBcdTUyMUJcdTVFRkFcdTRFMzRcdTY1RjZcdTc2RUVcdTVGNTVcblx0Y3JlYXRlRGlyKERpc3RQYXRoKTtcblxuXHQvLyBcdTUyMUJcdTVFRkEganNvbiBcdTY1ODdcdTRFRjZcblx0Y3JlYXRlSnNvbigpO1xuXG5cdC8vIFx1NTIxQlx1NUVGQVx1NjNDRlx1OEZGMFx1NjU4N1x1NEVGNlxuXHRjcmVhdGVEZXNjcmliZSh7IHNlcnZpY2UsIGxpc3QgfSk7XG5cblx0cmV0dXJuIHtcblx0XHRzZXJ2aWNlLFxuXHRcdGxpc3Rcblx0fTtcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXGJ1aWxkXFxcXGNvb2xcXFxcZXBzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJHOlxcXFxwcm9qZWN0XFxcXGltYWdlLW51bWJlci1wbGF5ZXItYWRtaW5cXFxcYnVpbGRcXFxcY29vbFxcXFxlcHNcXFxcY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9HOi9wcm9qZWN0L2ltYWdlLW51bWJlci1wbGF5ZXItYWRtaW4vYnVpbGQvY29vbC9lcHMvY29uZmlnLnRzXCI7aW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5cbi8vIFx1NjI1M1x1NTMwNVx1OERFRlx1NUY4NFxuZXhwb3J0IGNvbnN0IERpc3RQYXRoID0gam9pbihfX2Rpcm5hbWUsIFwiLi4vZGlzdFwiKTtcblxuLy8gXHU1QjlFXHU0RjUzXHU2M0NGXHU4RkYwXG5leHBvcnQgY29uc3QgRW50aXR5ID0ge1xuXHRtYXBwaW5nOiBbXG5cdFx0Ly8ge1xuXHRcdC8vIFx0Ly8gXHU4MUVBXHU1QjlBXHU0RTQ5XHU1MzM5XHU5MTREXG5cdFx0Ly8gXHRjdXN0b206ICh7IHByb3BlcnR5TmFtZSwgdHlwZSB9KSA9PiB7XG5cdFx0Ly8gXHRcdC8vIFx1NTk4Mlx1Njc5Q1x1NkNBMVx1NjcwOVx1RkYwQ1x1OEZENFx1NTZERW51bGxcdTYyMTZcdTgwMDVcdTRFMERcdThGRDRcdTU2REVcdUZGMENcdTUyMTlcdTdFRTdcdTdFRURcdTkwNERcdTUzODZcdTUxNzZcdTRFRDZcdTUzMzlcdTkxNERcdTg5QzRcdTUyMTlcblx0XHQvLyBcdFx0cmV0dXJuIG51bGw7XG5cdFx0Ly8gXHR9XG5cdFx0Ly8gfSxcblx0XHR7XG5cdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0dGVzdDogW1widmFyY2hhclwiLCBcInRleHRcIiwgXCJzaW1wbGUtanNvblwiXVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dHlwZTogXCJzdHJpbmdbXVwiLFxuXHRcdFx0dGVzdDogW1wic2ltcGxlLWFycmF5XCJdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0eXBlOiBcIkRhdGVcIixcblx0XHRcdHRlc3Q6IFtcImRhdGV0aW1lXCIsIFwiZGF0ZVwiXVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dHlwZTogXCJudW1iZXJcIixcblx0XHRcdHRlc3Q6IFtcInRpbnlpbnRcIiwgXCJpbnRcIiwgXCJkZWNpbWFsXCJdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0eXBlOiBcIkJpZ0ludFwiLFxuXHRcdFx0dGVzdDogW1wiYmlnaW50XCJdXG5cdFx0fVxuXHRdXG59O1xuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJHOlxcXFxwcm9qZWN0XFxcXGltYWdlLW51bWJlci1wbGF5ZXItYWRtaW5cXFxcYnVpbGRcXFxcY29vbFxcXFxtZW51XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJHOlxcXFxwcm9qZWN0XFxcXGltYWdlLW51bWJlci1wbGF5ZXItYWRtaW5cXFxcYnVpbGRcXFxcY29vbFxcXFxtZW51XFxcXGluZGV4LnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9HOi9wcm9qZWN0L2ltYWdlLW51bWJlci1wbGF5ZXItYWRtaW4vYnVpbGQvY29vbC9tZW51L2luZGV4LnRzXCI7aW1wb3J0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSBmcm9tIFwiZnNcIjtcbmltcG9ydCBwcmV0dGllciBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbWtkaXJzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbi8vIFx1NTIxQlx1NUVGQVx1NjU4N1x1NEVGNlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1lbnUob3B0aW9uczogeyB2aWV3UGF0aDogc3RyaW5nOyBjb2RlOiBzdHJpbmcgfSkge1xuXHQvLyBcdTY4M0NcdTVGMEZcdTUzMTZcdTUxODVcdTVCQjlcblx0Y29uc3QgY29udGVudCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChvcHRpb25zLmNvZGUsIHtcblx0XHRwYXJzZXI6IFwidnVlXCIsXG5cdFx0dXNlVGFiczogdHJ1ZSxcblx0XHR0YWJXaWR0aDogNCxcblx0XHRlbmRPZkxpbmU6IFwibGZcIixcblx0XHRzZW1pOiB0cnVlLFxuXHRcdGpzeEJyYWNrZXRTYW1lTGluZTogdHJ1ZSxcblx0XHRzaW5nbGVRdW90ZTogZmFsc2UsXG5cdFx0cHJpbnRXaWR0aDogMTAwLFxuXHRcdHRyYWlsaW5nQ29tbWE6IFwibm9uZVwiXG5cdH0pO1xuXG5cdC8vIFx1NzZFRVx1NUY1NVx1OERFRlx1NUY4NFxuXHRjb25zdCBkaXIgPSAob3B0aW9ucy52aWV3UGF0aCB8fCBcIlwiKS5zcGxpdChcIi9cIik7XG5cblx0Ly8gXHU2NTg3XHU0RUY2XHU1NDBEXG5cdGNvbnN0IGZuYW1lID0gZGlyLnBvcCgpO1xuXG5cdC8vIFx1NTIxQlx1NUVGQVx1NzZFRVx1NUY1NVxuXHRjb25zdCBwYXRoID0gbWtkaXJzKGAuL3NyYy8ke2Rpci5qb2luKFwiL1wiKX1gKTtcblxuXHQvLyBcdTUyMUJcdTVFRkFcdTY1ODdcdTRFRjZcblx0Y3JlYXRlV3JpdGVTdHJlYW0oam9pbihwYXRoLCBmbmFtZSB8fCBcImRlbW9cIiksIHtcblx0XHRmbGFnczogXCJ3XCJcblx0fSkud3JpdGUoY29udGVudCk7XG59XG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkc6XFxcXHByb2plY3RcXFxcaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pblxcXFxidWlsZFxcXFxjb29sXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJHOlxcXFxwcm9qZWN0XFxcXGltYWdlLW51bWJlci1wbGF5ZXItYWRtaW5cXFxcYnVpbGRcXFxcY29vbFxcXFxiYXNlLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9HOi9wcm9qZWN0L2ltYWdlLW51bWJlci1wbGF5ZXItYWRtaW4vYnVpbGQvY29vbC9iYXNlLnRzXCI7aW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHsgY3JlYXRlU3ZnIH0gZnJvbSBcIi4vc3ZnXCI7XG5pbXBvcnQgeyBjcmVhdGVUYWcgfSBmcm9tIFwiLi90YWdcIjtcbmltcG9ydCB7IGNyZWF0ZUVwcyB9IGZyb20gXCIuL2Vwc1wiO1xuaW1wb3J0IHsgY3JlYXRlTWVudSB9IGZyb20gXCIuL21lbnVcIjtcbmltcG9ydCB7IHBhcnNlSnNvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlKCk6IFBsdWdpbiB7XG5cdHJldHVybiB7XG5cdFx0bmFtZTogXCJ2aXRlLWNvb2wtYmFzZVwiLFxuXHRcdGVuZm9yY2U6IFwicHJlXCIsXG5cdFx0Y29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuXHRcdFx0c2VydmVyLm1pZGRsZXdhcmVzLnVzZShhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcblx0XHRcdFx0ZnVuY3Rpb24gZG9uZShkYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRyZXMud3JpdGVIZWFkKDIwMCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbDtjaGFyc2V0PVVURi04XCIgfSk7XG5cdFx0XHRcdFx0cmVzLmVuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVxLnVybD8uaW5jbHVkZXMoXCJfX2Nvb2xcIikpIHtcblx0XHRcdFx0XHRjb25zdCBib2R5ID0gYXdhaXQgcGFyc2VKc29uKHJlcSk7XG5cblx0XHRcdFx0XHRzd2l0Y2ggKHJlcS51cmwpIHtcblx0XHRcdFx0XHRcdC8vIFx1NUZFQlx1OTAxRlx1NTIxQlx1NUVGQVx1ODNEQ1x1NTM1NVxuXHRcdFx0XHRcdFx0Y2FzZSBcIi9fX2Nvb2xfY3JlYXRlTWVudVwiOlxuXHRcdFx0XHRcdFx0XHRhd2FpdCBjcmVhdGVNZW51KGJvZHkpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Ly8gXHU1MjFCXHU1RUZBXHU2M0NGXHU4RkYwXHU2NTg3XHU0RUY2XG5cdFx0XHRcdFx0XHRjYXNlIFwiL19fY29vbF9lcHNcIjpcblx0XHRcdFx0XHRcdFx0YXdhaXQgY3JlYXRlRXBzKGJvZHkpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGRvbmUoe1xuXHRcdFx0XHRcdFx0XHRcdGNvZGU6IDEwMDEsXG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogXCJcdTY3MkFcdTc3RTVcdThCRjdcdTZDNDJcIlxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRkb25lKHtcblx0XHRcdFx0XHRcdGNvZGU6IDEwMDBcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuZXh0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0dHJhbnNmb3JtKGNvZGUsIGlkKSB7XG5cdFx0XHRyZXR1cm4gY3JlYXRlVGFnKGNvZGUsIGlkKTtcblx0XHR9LFxuXHRcdHRyYW5zZm9ybUluZGV4SHRtbChodG1sKSB7XG5cdFx0XHRyZXR1cm4gY3JlYXRlU3ZnKGh0bWwpO1xuXHRcdH1cblx0fTtcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXGJ1aWxkXFxcXGNvb2xcXFxcbW9kdWxlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJHOlxcXFxwcm9qZWN0XFxcXGltYWdlLW51bWJlci1wbGF5ZXItYWRtaW5cXFxcYnVpbGRcXFxcY29vbFxcXFxtb2R1bGVcXFxcaW5kZXgudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0c6L3Byb2plY3QvaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pbi9idWlsZC9jb29sL21vZHVsZS9pbmRleC50c1wiO2ltcG9ydCBmcyBmcm9tIFwiZnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZHVsZSgpIHtcblx0bGV0IGRpcnM6IHN0cmluZ1tdID0gW107XG5cblx0dHJ5IHtcblx0XHRkaXJzID0gZnMucmVhZGRpclN5bmMoXCIuL3NyYy9tb2R1bGVzXCIpO1xuXHRcdGRpcnMgPSBkaXJzLmZpbHRlcigoZSkgPT4gIWUuaW5jbHVkZXMoXCIuXCIpKTtcblx0fSBjYXRjaCAoZXJyKSB7fVxuXG5cdHJldHVybiB7IGRpcnMgfTtcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXGJ1aWxkXFxcXGNvb2xcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkc6XFxcXHByb2plY3RcXFxcaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pblxcXFxidWlsZFxcXFxjb29sXFxcXHZpcnR1YWwudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0c6L3Byb2plY3QvaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pbi9idWlsZC9jb29sL3ZpcnR1YWwudHNcIjtpbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBjcmVhdGVFcHMgfSBmcm9tIFwiLi9lcHNcIjtcbmltcG9ydCB7IGNyZWF0ZU1vZHVsZSB9IGZyb20gXCIuL21vZHVsZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdmlydHVhbCgpOiBQbHVnaW4ge1xuXHRjb25zdCB2aXJ0dWFsTW9kdWxlSWRzID0gW1widmlydHVhbDplcHNcIiwgXCJ2aXJ0dWFsOm1vZHVsZVwiXTtcblxuXHQvLyBcdTk5OTZcdTZCMjFcdTU0MkZcdTUyQThcdTUyQTBcdThGN0QgRXBzXG5cdGNyZWF0ZUVwcygpO1xuXG5cdHJldHVybiB7XG5cdFx0bmFtZTogXCJ2aXRlLWNvb2wtdmlydHVhbFwiLFxuXHRcdGVuZm9yY2U6IFwicHJlXCIsXG5cdFx0Y29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuXHRcdFx0c2VydmVyLm1pZGRsZXdhcmVzLnVzZShhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcblx0XHRcdFx0Ly8gXHU5ODc1XHU5NzYyXHU1MjM3XHU2NUIwXHU2NUY2XHU4OUU2XHU1M0QxXG5cdFx0XHRcdGlmIChyZXEudXJsID09IFwiL0B2aXRlL2NsaWVudFwiKSB7XG5cdFx0XHRcdFx0Ly8gXHU5MUNEXHU2NUIwXHU1MkEwXHU4RjdEXHU4NjVBXHU2MkRGXHU2QTIxXHU1NzU3XG5cdFx0XHRcdFx0dmlydHVhbE1vZHVsZUlkcy5mb3JFYWNoKCh2bSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kID0gc2VydmVyLm1vZHVsZUdyYXBoLmdldE1vZHVsZUJ5SWQoYFxcMCR7dm19YCk7XG5cblx0XHRcdFx0XHRcdGlmIChtb2QpIHtcblx0XHRcdFx0XHRcdFx0c2VydmVyLm1vZHVsZUdyYXBoLmludmFsaWRhdGVNb2R1bGUobW9kKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0YXN5bmMgaGFuZGxlSG90VXBkYXRlKHsgZmlsZSwgc2VydmVyIH0pIHtcblx0XHRcdC8vIFx1NEVFM1x1NzgwMVx1NEZERFx1NUI1OFx1NjVGNlx1ODlFNlx1NTNEMVxuXHRcdFx0aWYgKCFmaWxlLmluY2x1ZGVzKFwiYnVpbGQvY29vbC9kaXN0XCIpKSB7XG5cdFx0XHRcdGNvbnN0IHsgc2VydmljZSB9ID0gYXdhaXQgY3JlYXRlRXBzKCk7XG5cblx0XHRcdFx0Ly8gXHU5MDFBXHU3N0U1XHU1QkEyXHU2MjM3XHU3QUVGXHU1MjM3XHU2NUIwXG5cdFx0XHRcdHNlcnZlci53cy5zZW5kKHtcblx0XHRcdFx0XHR0eXBlOiBcImN1c3RvbVwiLFxuXHRcdFx0XHRcdGV2ZW50OiBcImVwcy11cGRhdGVcIixcblx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRzZXJ2aWNlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlc29sdmVJZChpZCkge1xuXHRcdFx0aWYgKHZpcnR1YWxNb2R1bGVJZHMuaW5jbHVkZXMoaWQpKSB7XG5cdFx0XHRcdHJldHVybiBcIlxcMFwiICsgaWQ7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRhc3luYyBsb2FkKGlkKSB7XG5cdFx0XHRpZiAoaWQgPT09IFwiXFwwdmlydHVhbDplcHNcIikge1xuXHRcdFx0XHRjb25zdCB7IHNlcnZpY2UgfSA9IGF3YWl0IGNyZWF0ZUVwcygpO1xuXG5cdFx0XHRcdHJldHVybiBgXG5cdFx0XHRcdFx0ZXhwb3J0IGNvbnN0IGVwcyA9ICR7SlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlIH0pfVxuXHRcdFx0XHRgO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaWQgPT09IFwiXFwwdmlydHVhbDptb2R1bGVcIikge1xuXHRcdFx0XHRjb25zdCB7IGRpcnMgfSA9IGNyZWF0ZU1vZHVsZSgpO1xuXG5cdFx0XHRcdHJldHVybiBgXG5cdFx0XHRcdFx0ZXhwb3J0IGNvbnN0IGRpcnMgPSAke0pTT04uc3RyaW5naWZ5KGRpcnMpfVxuXHRcdFx0XHRgO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXGJ1aWxkXFxcXGNvb2xcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkc6XFxcXHByb2plY3RcXFxcaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pblxcXFxidWlsZFxcXFxjb29sXFxcXGRlbW8udHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0c6L3Byb2plY3QvaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pbi9idWlsZC9jb29sL2RlbW8udHNcIjtpbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBnbG9iIH0gZnJvbSBcImdsb2JcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlbW8oZW5hYmxlPzogYm9vbGVhbik6IFBsdWdpbiB7XG5cdGNvbnN0IHZpcnR1YWxNb2R1bGVJZHMgPSBbXCJ2aXJ0dWFsOmRlbW9cIl07XG5cblx0cmV0dXJuIHtcblx0XHRuYW1lOiBcInZpdGUtY29vbC1kZW1vXCIsXG5cdFx0ZW5mb3JjZTogXCJwcmVcIixcblx0XHRyZXNvbHZlSWQoaWQpIHtcblx0XHRcdGlmICh2aXJ0dWFsTW9kdWxlSWRzLmluY2x1ZGVzKGlkKSkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXDBcIiArIGlkO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YXN5bmMgbG9hZChpZCkge1xuXHRcdFx0aWYgKGlkID09PSBcIlxcMHZpcnR1YWw6ZGVtb1wiKSB7XG5cdFx0XHRcdGNvbnN0IGRlbW8gPSB7fTtcblxuXHRcdFx0XHRpZiAoZW5hYmxlKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmlsZXMgPSBhd2FpdCBnbG9iKFwiLi9zcmMvbW9kdWxlcy9kZW1vL3ZpZXdzL2NydWQvY29tcG9uZW50cy8qKlwiLCB7XG5cdFx0XHRcdFx0XHRzdGF0OiB0cnVlLFxuXHRcdFx0XHRcdFx0d2l0aEZpbGVUeXBlczogdHJ1ZVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG5cdFx0XHRcdFx0XHRpZiAoZmlsZS5pc0ZpbGUoKSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBwID0gcGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKTtcblxuXHRcdFx0XHRcdFx0XHRkZW1vW1xuXHRcdFx0XHRcdFx0XHRcdHBcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuXHRcdFx0XHRcdFx0XHRcdFx0LnNwbGl0KFwic3JjL21vZHVsZXMvZGVtby92aWV3cy9jcnVkL2NvbXBvbmVudHMvXCIpWzFdXG5cdFx0XHRcdFx0XHRcdF0gPSByZWFkRmlsZVN5bmMocCwgXCJ1dGYtOFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gYFxuXHRcdFx0XHRcdGV4cG9ydCBjb25zdCBkZW1vID0gJHtKU09OLnN0cmluZ2lmeShkZW1vKX07XG5cdFx0XHRcdGA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJHOlxcXFxwcm9qZWN0XFxcXGltYWdlLW51bWJlci1wbGF5ZXItYWRtaW5cXFxcYnVpbGRcXFxcY29vbFwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRzpcXFxccHJvamVjdFxcXFxpbWFnZS1udW1iZXItcGxheWVyLWFkbWluXFxcXGJ1aWxkXFxcXGNvb2xcXFxcaW5kZXgudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0c6L3Byb2plY3QvaW1hZ2UtbnVtYmVyLXBsYXllci1hZG1pbi9idWlsZC9jb29sL2luZGV4LnRzXCI7aW1wb3J0IHsgYmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IHZpcnR1YWwgfSBmcm9tIFwiLi92aXJ0dWFsXCI7XG5pbXBvcnQgeyBkZW1vIH0gZnJvbSBcIi4vZGVtb1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29vbCh0ZXN0PzogYm9vbGVhbikge1xuXHRyZXR1cm4gW1xuXHRcdC8vIFx1NTdGQVx1Nzg0MFxuXHRcdGJhc2UoKSxcblx0XHQvLyBcdTg2NUFcdTYyREZcdTZBMjFcdTU3NTdcblx0XHR2aXJ0dWFsKCksXG5cdFx0Ly8gZGVtbyBcdTVCOThcdTY1QjlcdTc5M0FcdTRGOEJcdUZGMENcdTRFRTNcdTc4MDFcdTcyNDdcdTZCQjVcblx0XHRkZW1vKHRlc3QpXG5cdF07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQXNTLE9BQU9BLFdBQVU7QUFFdlQsT0FBTyxTQUFTO0FBQ2hCLE9BQU8sWUFBWTtBQUNuQixPQUFPLGlCQUFpQjtBQUN4QixTQUFTLGtCQUFrQjs7O0FDTHlTLElBQU0sUUFBUTtBQUFBLEVBQ2pWLFNBQVM7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLGNBQWM7QUFBQSxJQUNkLFNBQVMsQ0FBQ0MsVUFBaUJBLE1BQUssUUFBUSxVQUFVLEVBQUU7QUFBQSxFQUNyRDtBQUFBLEVBRUEsVUFBVTtBQUFBLElBQ1QsUUFBUTtBQUFBLElBQ1IsY0FBYztBQUFBLElBQ2QsU0FBUyxDQUFDQSxVQUFpQkEsTUFBSyxRQUFRLFdBQVcsTUFBTTtBQUFBLEVBQzFEO0FBQ0Q7OztBQ1oyVSxTQUFTLGNBQWMsbUJBQW1CO0FBQ3JYLFNBQVMsZUFBZTtBQUV4QixTQUFTLFVBQVUsS0FBdUI7QUFDekMsUUFBTSxNQUFnQixDQUFDO0FBQ3ZCLFFBQU0sT0FBTyxZQUFZLEtBQUs7QUFBQSxJQUM3QixlQUFlO0FBQUEsRUFDaEIsQ0FBQztBQUNELGFBQVcsS0FBSyxNQUFNO0FBQ3JCLFFBQUksRUFBRSxZQUFZLEdBQUc7QUFDcEIsVUFBSSxLQUFLLEdBQUcsVUFBVSxNQUFNLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFBQSxJQUMxQyxPQUFPO0FBQ04sVUFBSSxRQUFRLEVBQUUsSUFBSSxLQUFLLFFBQVE7QUFDOUIsY0FBTSxNQUFNLGFBQWEsTUFBTSxFQUFFLElBQUksRUFDbkMsU0FBUyxFQUNULFFBQVEsY0FBYyxFQUFFLEVBQ3hCLFFBQVEsbUJBQW1CLENBQUMsR0FBUSxPQUFZO0FBQ2hELGNBQUksUUFBUTtBQUNaLGNBQUksU0FBUztBQUNiLGNBQUksVUFBVSxHQUFHO0FBQUEsWUFDaEI7QUFBQSxZQUNBLENBQUNDLElBQVEsSUFBUyxPQUFZO0FBQzdCLGtCQUFJLE9BQU8sU0FBUztBQUNuQix3QkFBUTtBQUFBLGNBQ1QsV0FBVyxPQUFPLFVBQVU7QUFDM0IseUJBQVM7QUFBQSxjQUNWO0FBQ0EscUJBQU87QUFBQSxZQUNSO0FBQUEsVUFDRDtBQUNBLGNBQUksQ0FBQyx3QkFBd0IsS0FBSyxFQUFFLEdBQUc7QUFDdEMsdUJBQVcsZ0JBQWdCLEtBQUssSUFBSSxNQUFNO0FBQUEsVUFDM0M7QUFDQSxpQkFBTyxvQkFBb0IsRUFBRSxLQUFLLFFBQVEsUUFBUSxFQUFFLENBQUMsS0FBSyxPQUFPO0FBQUEsUUFDbEUsQ0FBQyxFQUNBLFFBQVEsVUFBVSxXQUFXO0FBQy9CLFlBQUksS0FBSyxHQUFHO0FBQUEsTUFDYjtBQUFBLElBQ0Q7QUFBQSxFQUNEO0FBQ0EsU0FBTztBQUNSO0FBRU8sU0FBUyxVQUFVLE1BQWM7QUFDdkMsUUFBTSxNQUFNLFVBQVUsUUFBUTtBQUU5QixTQUFPLEtBQUs7QUFBQSxJQUNYO0FBQUEsSUFDQTtBQUFBO0FBQUEsTUFFSSxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQUE7QUFBQSxFQUVqQjtBQUNEOzs7QUNyRDJVLFNBQVMsT0FBTyxxQkFBcUI7QUFDaFgsT0FBTyxpQkFBaUI7QUFFakIsU0FBUyxVQUFVLE1BQWMsSUFBWTtBQUNuRCxNQUFJLFNBQVMsS0FBSyxFQUFFLEdBQUc7QUFDdEIsUUFBSTtBQUNKLFVBQU0sTUFBTSxNQUFNLE1BQU0sSUFBSSxJQUFJLFlBQVksSUFBSTtBQUNoRCxVQUFNLEVBQUUsV0FBVyxJQUFJLE1BQU0sSUFBSTtBQUVqQyxRQUFJLENBQUMsV0FBVyxVQUFVLFdBQVcsYUFBYTtBQUNqRCxZQUFNLE1BQU0sY0FBYyxZQUFZLEVBQUUsR0FBRyxDQUFDO0FBQzVDLFlBQU0sRUFBRSxNQUFNLEtBQUssSUFBUyxJQUFJO0FBRWhDLFVBQUksRUFBRTtBQUFBLFFBQ0w7QUFBQSxRQUNBLGlCQUFpQixJQUFJO0FBQUE7QUFBQTtBQUFBLGVBR1YsSUFBSTtBQUFBO0FBQUE7QUFBQSxNQUdoQjtBQUVBLGFBQU87QUFBQSxRQUNOLEtBQUssSUFBSSxFQUFFLFlBQVk7QUFBQSxRQUN2QixNQUFNLElBQUksRUFBRSxTQUFTO0FBQUEsTUFDdEI7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUVBLFNBQU87QUFDUjs7O0FDL0JpVixPQUFPLFFBQVE7QUFDaFcsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sV0FBVztBQUdYLFNBQVMsZUFBZSxPQUF1QjtBQUNyRCxTQUFPLE1BQU0sUUFBUSxnQkFBZ0IsU0FBVSxJQUFJLElBQUksSUFBSTtBQUMxRCxXQUFPLEdBQUcsWUFBWSxJQUFJO0FBQUEsRUFDM0IsQ0FBQztBQUNGO0FBR08sU0FBUyxRQUFRLEtBQXFCO0FBQzVDLFNBQU8sSUFBSSxRQUFRLHVCQUF1QixTQUFVLElBQUksSUFBSSxJQUFJO0FBQy9ELFdBQU8sS0FBSyxHQUFHLFlBQVk7QUFBQSxFQUM1QixDQUFDO0FBQ0Y7QUFHTyxTQUFTLFVBQVVDLE9BQWM7QUFDdkMsTUFBSSxDQUFDLEdBQUcsV0FBV0EsS0FBSTtBQUFHLE9BQUcsVUFBVUEsS0FBSTtBQUM1QztBQUdPLFNBQVMsU0FBUyxNQUFjO0FBQ3RDLE1BQUk7QUFDSCxXQUFPLEdBQUcsYUFBYSxNQUFNLE1BQU07QUFBQSxFQUNwQyxTQUFTLEdBQUc7QUFBQSxFQUFDO0FBRWIsU0FBTztBQUNSO0FBR08sU0FBUyxVQUFVLEtBQXdCO0FBQ2pELFNBQU8sSUFBSSxRQUFRLENBQUNDLGFBQVk7QUFDL0IsUUFBSSxJQUFJO0FBQ1IsUUFBSSxHQUFHLFFBQVEsU0FBVSxPQUFlO0FBQ3ZDLFdBQUs7QUFBQSxJQUNOLENBQUM7QUFDRCxRQUFJLEdBQUcsT0FBTyxXQUFZO0FBQ3pCLFVBQUk7QUFDSCxRQUFBQSxTQUFRLEtBQUssTUFBTSxDQUFDLENBQUM7QUFBQSxNQUN0QixRQUFRO0FBQ1AsUUFBQUEsU0FBUSxDQUFDLENBQUM7QUFBQSxNQUNYO0FBQUEsSUFDRCxDQUFDO0FBQUEsRUFDRixDQUFDO0FBQ0Y7QUFHTyxTQUFTLE9BQU9ELE9BQWM7QUFDcEMsUUFBTSxNQUFNQSxNQUFLLE1BQU0sR0FBRztBQUMxQixNQUFJLElBQUk7QUFFUixNQUFJLFFBQVEsQ0FBQyxNQUFNO0FBQ2xCLFVBQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQztBQUVuQixRQUFJO0FBQ0gsU0FBRyxTQUFTLENBQUM7QUFBQSxJQUNkLFNBQVMsS0FBSztBQUNiLFVBQUk7QUFDSCxXQUFHLFVBQVUsQ0FBQztBQUFBLE1BQ2YsU0FBU0UsUUFBTztBQUNmLGdCQUFRLE1BQU1BLE1BQUs7QUFBQSxNQUNwQjtBQUFBLElBQ0Q7QUFDQSxRQUFJO0FBQUEsRUFDTCxDQUFDO0FBRUQsU0FBTztBQUNSO0FBRU8sU0FBUyxNQUFNLFNBQWlCO0FBQ3RDLFVBQVEsSUFBSSxxQkFBcUIsR0FBRyxNQUFNLEVBQUUsT0FBTyxVQUFVLENBQUMsSUFBSSxXQUFXLEVBQUUsRUFBRTtBQUNsRjs7O0FDekVBLFNBQVMsUUFBQUMsYUFBWTs7O0FDRHdULFNBQVMsUUFBQUMsYUFBWTtBQUFsVyxJQUFNLG1DQUFtQztBQUdsQyxJQUFNLFdBQVdDLE1BQUssa0NBQVcsU0FBUztBQUcxQyxJQUFNLFNBQVM7QUFBQSxFQUNyQixTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVFSO0FBQUEsTUFDQyxNQUFNO0FBQUEsTUFDTixNQUFNLENBQUMsV0FBVyxRQUFRLGFBQWE7QUFBQSxJQUN4QztBQUFBLElBQ0E7QUFBQSxNQUNDLE1BQU07QUFBQSxNQUNOLE1BQU0sQ0FBQyxjQUFjO0FBQUEsSUFDdEI7QUFBQSxJQUNBO0FBQUEsTUFDQyxNQUFNO0FBQUEsTUFDTixNQUFNLENBQUMsWUFBWSxNQUFNO0FBQUEsSUFDMUI7QUFBQSxJQUNBO0FBQUEsTUFDQyxNQUFNO0FBQUEsTUFDTixNQUFNLENBQUMsV0FBVyxPQUFPLFNBQVM7QUFBQSxJQUNuQztBQUFBLElBQ0E7QUFBQSxNQUNDLE1BQU07QUFBQSxNQUNOLE1BQU0sQ0FBQyxRQUFRO0FBQUEsSUFDaEI7QUFBQSxFQUNEO0FBQ0Q7OztBRGpDQSxPQUFPLFdBQVc7QUFDbEIsU0FBUyxTQUFTLFNBQVMsTUFBTSxPQUFPLGVBQWU7QUFDdkQsU0FBUyx5QkFBeUI7QUFDbEMsT0FBTyxjQUFjO0FBS3JCLFNBQVMsU0FBUyxHQUFRO0FBQ3pCLFNBQU8sT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDN0U7QUFHQSxJQUFNLFVBQVUsQ0FBQztBQUNqQixJQUFJLE9BQXFCLENBQUM7QUFDMUIsSUFBSSxZQUEwQixDQUFDO0FBRy9CLGVBQWUsUUFBUSxPQUFzQjtBQUU1QyxNQUFJLENBQUMsUUFBUSxLQUFLLEdBQUc7QUFDcEIsaUJBQWEsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU07QUFDcEMsYUFBTztBQUFBLFFBQ04sR0FBRztBQUFBLFFBQ0gsU0FBUztBQUFBLE1BQ1Y7QUFBQSxJQUNELENBQUM7QUFBQSxFQUNGO0FBR0EsTUFBSTtBQUNILFdBQU8sS0FBSyxNQUFNLFNBQVNDLE1BQUssVUFBVSxVQUFVLENBQUMsS0FBSyxJQUFJO0FBQUEsRUFDL0QsU0FBUyxLQUFVO0FBQ2xCLFVBQU0sU0FBU0EsTUFBSyxVQUFVLFVBQVUsQ0FBQyw4QkFBVSxJQUFJLE9BQU8sRUFBRTtBQUFBLEVBQ2pFO0FBR0EsUUFBTSxNQUFNLE1BQU0sT0FBTyxFQUFFLFNBQVM7QUFHcEMsUUFBTSxNQUNKLElBQUksS0FBSztBQUFBLElBQ1QsU0FBUztBQUFBLEVBQ1YsQ0FBQyxFQUNBLEtBQUssQ0FBQyxRQUFRO0FBQ2QsVUFBTSxFQUFFLE1BQU0sS0FBSyxJQUFJLElBQUk7QUFFM0IsUUFBSSxTQUFTLEtBQU07QUFDbEIsVUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLE1BQU07QUFDM0IsY0FBTSxNQUFNLE9BQU8sT0FBTyxJQUFJLEVBQUUsS0FBSyxDQUFpQjtBQUFBLE1BQ3ZEO0FBQUEsSUFDRDtBQUFBLEVBQ0QsQ0FBQyxFQUNBLE1BQU0sTUFBTTtBQUNaLFVBQU0sZ0RBQWtCLEdBQUcsRUFBRTtBQUFBLEVBQzlCLENBQUM7QUFHRixNQUFJLFFBQVEsU0FBUyxHQUFHO0FBQ3ZCLGNBQVUsUUFBUSxDQUFDLE1BQU07QUFDeEIsWUFBTSxJQUFJLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTTtBQUVoRCxVQUFJLEdBQUc7QUFDTixjQUFNLEdBQUcsQ0FBQztBQUFBLE1BQ1gsT0FBTztBQUNOLGFBQUssS0FBSyxDQUFDO0FBQUEsTUFDWjtBQUFBLElBQ0QsQ0FBQztBQUFBLEVBQ0Y7QUFFQSxTQUFPLFFBQVEsTUFBTSxRQUFRO0FBQzlCO0FBR0EsU0FBUyxhQUFhO0FBQ3JCLFFBQU0sSUFBSSxLQUNSLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQ3hCLElBQUksQ0FBQyxNQUFNO0FBQ1gsV0FBTztBQUFBLE1BQ04sUUFBUSxFQUFFO0FBQUEsTUFDVixNQUFNLEVBQUUsUUFBUTtBQUFBLE1BQ2hCLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQ0MsT0FBTTtBQUNyQixlQUFPO0FBQUEsVUFDTixNQUFNQSxHQUFFO0FBQUEsVUFDUixRQUFRQSxHQUFFO0FBQUEsVUFDVixNQUFNQSxHQUFFO0FBQUEsUUFDVDtBQUFBLE1BQ0QsQ0FBQztBQUFBLElBQ0Y7QUFBQSxFQUNELENBQUM7QUFFRixvQkFBa0JELE1BQUssVUFBVSxVQUFVLEdBQUc7QUFBQSxJQUM3QyxPQUFPO0FBQUEsRUFDUixDQUFDLEVBQUUsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQzNCO0FBR0EsZUFBZSxlQUFlLEVBQUUsTUFBQUUsT0FBTSxTQUFBQyxTQUFRLEdBQXlDO0FBRXRGLFdBQVMsUUFBUSxFQUFFLGNBQWMsS0FBSyxHQUFRO0FBQzdDLGVBQVcsT0FBTyxPQUFPLFNBQVM7QUFDakMsVUFBSSxJQUFJLFFBQVE7QUFDZixjQUFNLFVBQVUsSUFBSSxPQUFPLEVBQUUsY0FBYyxLQUFLLENBQUM7QUFDakQsWUFBSTtBQUFTLGlCQUFPO0FBQUEsTUFDckI7QUFDQSxVQUFJLElBQUksTUFBTTtBQUNiLFlBQUksSUFBSSxLQUFLLFNBQVMsSUFBSTtBQUFHLGlCQUFPLElBQUk7QUFBQSxNQUN6QztBQUFBLElBQ0Q7QUFDQSxXQUFPO0FBQUEsRUFDUjtBQUdBLFdBQVMsZUFBZTtBQUN2QixVQUFNLEtBQWlCLENBQUM7QUFFeEIsZUFBVyxRQUFRRCxPQUFNO0FBQ3hCLFVBQUksQ0FBQyxLQUFLO0FBQU07QUFDaEIsWUFBTSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSTtBQUVyQyxpQkFBVyxPQUFPLEtBQUssV0FBVyxDQUFDLEdBQUc7QUFFckMsVUFBRSxLQUFLLElBQUk7QUFDWCxVQUFFLEtBQUssT0FBTztBQUNkLFVBQUUsS0FBSyxNQUFNLElBQUksT0FBTztBQUFBLENBQUk7QUFDNUIsVUFBRSxLQUFLLE9BQU87QUFDZCxVQUFFO0FBQUEsVUFDRCxHQUFHLElBQUksWUFBWSxNQUFNLFFBQVE7QUFBQSxZQUNoQyxjQUFjLElBQUk7QUFBQSxZQUNsQixNQUFNLElBQUk7QUFBQSxVQUNYLENBQUMsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNEO0FBQ0EsUUFBRSxLQUFLLElBQUk7QUFDWCxRQUFFLEtBQUssT0FBTztBQUNkLFFBQUUsS0FBSztBQUFBLENBQVc7QUFDbEIsUUFBRSxLQUFLLE9BQU87QUFDZCxRQUFFLEtBQUsscUJBQXFCO0FBQzVCLFFBQUUsS0FBSyxHQUFHO0FBQ1YsU0FBRyxLQUFLLENBQUM7QUFBQSxJQUNWO0FBRUEsV0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLE1BQU07QUFBQSxFQUM3QztBQUdBLFdBQVMsWUFBWTtBQUNwQixVQUFNLEtBQWlCLENBQUM7QUFFeEIsVUFBTSxLQUFLO0FBQUEsTUFDVjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFpQkQ7QUFHQSxhQUFTLEtBQUssR0FBUSxHQUFZO0FBQ2pDLFVBQUksQ0FBQztBQUFHLFlBQUk7QUFFWixpQkFBVyxLQUFLLEdBQUc7QUFDbEIsY0FBTSxPQUFPLElBQUksUUFBUSxlQUFlLEVBQUUsUUFBUSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBRTlELFlBQUksRUFBRSxDQUFDLEVBQUUsV0FBVztBQUVuQixnQkFBTSxPQUFPQSxNQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxRQUFRLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBRXZFLGNBQUksTUFBTTtBQUNULGtCQUFNLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSTtBQUVoQyxlQUFHLEtBQUssR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHO0FBR3hCLGdCQUFJLEtBQUssS0FBSztBQUViLG9CQUFNLGFBQXVCLENBQUM7QUFFOUIsbUJBQUssSUFBSSxRQUFRLENBQUMsTUFBTTtBQUV2QixzQkFBTSxLQUFLLEVBQUUsUUFBUSxLQUFLLEVBQUUsS0FBSyxNQUFNLEdBQUcsQ0FBQyxLQUFLLElBQUk7QUFBQSxrQkFDbkQ7QUFBQSxrQkFDQTtBQUFBLGdCQUNEO0FBRUEsb0JBQUksR0FBRztBQUVOLHNCQUFJLElBQWMsQ0FBQztBQUduQix3QkFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7QUFFdEMsNkJBQVcsUUFBUSxDQUFDLE1BQU07QUFDekIsd0JBQUksRUFBRSxhQUFhO0FBQ2xCLHdCQUFFLEtBQUs7QUFBQSxNQUFTLEVBQUUsV0FBVztBQUFBLENBQVE7QUFBQSxvQkFDdEM7QUFFQSx3QkFBSSxFQUFFLEtBQUssU0FBUyxHQUFHLEdBQUc7QUFDekIsNkJBQU87QUFBQSxvQkFDUjtBQUVBLDBCQUFNRSxLQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRztBQUMzQywwQkFBTSxJQUFJLEdBQUcsRUFBRSxPQUFPLFFBQVEsUUFBUTtBQUV0QyxzQkFBRSxLQUFLLElBQUlBLEVBQUMsTUFBTSxDQUFDLEdBQUc7QUFBQSxrQkFDdkIsQ0FBQztBQUVELHNCQUFJLFFBQVEsQ0FBQyxHQUFHO0FBQ2Ysd0JBQUksQ0FBQyxLQUFLO0FBQUEsa0JBQ1gsT0FBTztBQUNOLHNCQUFFLFFBQVEsR0FBRztBQUNiLHNCQUFFLEtBQUssR0FBRztBQUFBLGtCQUNYO0FBR0Esc0JBQUksTUFBTTtBQUdWLHdCQUFNLEtBQUssS0FBSyxRQUFRO0FBRXhCLDBCQUFRLEVBQUUsTUFBTTtBQUFBLG9CQUNmLEtBQUs7QUFDSiw0QkFBTTtBQUFBO0FBQUE7QUFBQSxvQkFHRyxFQUFFO0FBQUE7QUFBQTtBQUFBO0FBSVg7QUFBQSxvQkFFRCxLQUFLO0FBQ0osNEJBQU0sR0FBRyxFQUFFO0FBQ1g7QUFBQSxvQkFFRCxLQUFLO0FBQ0osNEJBQU07QUFDTjtBQUFBLG9CQUVEO0FBQ0MsNEJBQU07QUFDTjtBQUFBLGtCQUNGO0FBR0Esb0JBQUUsS0FBSyxJQUFJO0FBQ1gsb0JBQUUsS0FBSyxPQUFPO0FBQ2Qsb0JBQUUsS0FBSyxNQUFNLEVBQUUsV0FBVyxDQUFDO0FBQUEsQ0FBSTtBQUMvQixvQkFBRSxLQUFLLE9BQU87QUFFZCxvQkFBRTtBQUFBLG9CQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxJQUFJLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFBQSxzQkFDNUM7QUFBQSxvQkFDRCxDQUFDLGNBQWMsR0FBRztBQUFBLGtCQUNuQjtBQUVBLHNCQUFJLENBQUMsV0FBVyxTQUFTLENBQUMsR0FBRztBQUM1QiwrQkFBVyxLQUFLLENBQUM7QUFBQSxrQkFDbEI7QUFBQSxnQkFDRDtBQUFBLGNBQ0QsQ0FBQztBQUdELGdCQUFFLEtBQUssSUFBSTtBQUNYLGdCQUFFLEtBQUssT0FBTztBQUNkLGdCQUFFLEtBQUssK0JBQVc7QUFDbEIsZ0JBQUUsS0FBSyxPQUFPO0FBQ2QsZ0JBQUU7QUFBQSxnQkFDRCxpQkFBaUIsV0FDZixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUM1QixLQUFLLElBQUksQ0FBQztBQUFBLGNBQ2I7QUFHQSxnQkFBRSxLQUFLLElBQUk7QUFDWCxnQkFBRSxLQUFLLE9BQU87QUFDZCxnQkFBRSxLQUFLLCtCQUFXO0FBQ2xCLGdCQUFFLEtBQUssT0FBTztBQUNkLGdCQUFFO0FBQUEsZ0JBQ0Qsa0JBQWtCLFdBQ2hCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQzdCLEtBQUssSUFBSSxDQUFDO0FBQUEsY0FDYjtBQUdBLGdCQUFFLEtBQUssSUFBSTtBQUNYLGdCQUFFLEtBQUssT0FBTztBQUNkLGdCQUFFLEtBQUssbUJBQVM7QUFDaEIsZ0JBQUUsS0FBSyxPQUFPO0FBQ2QsZ0JBQUUsS0FBSyw2QkFBNkI7QUFBQSxZQUNyQztBQUVBLGNBQUUsS0FBSyxHQUFHO0FBQ1YsZUFBRyxLQUFLLENBQUM7QUFBQSxVQUNWO0FBQUEsUUFDRCxPQUFPO0FBQ04sYUFBRyxLQUFLLEdBQUcsQ0FBQyxLQUFLO0FBQ2pCLGVBQUssRUFBRSxDQUFDLEdBQUcsSUFBSTtBQUNmLGFBQUcsS0FBSyxJQUFJO0FBQUEsUUFDYjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBR0EsU0FBS0QsUUFBTztBQUdaLE9BQUcsS0FBSyxHQUFHO0FBR1gsT0FBRyxLQUFLLEVBQUU7QUFFVixXQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssTUFBTTtBQUFBLEVBQzdDO0FBR0EsUUFBTSxPQUFPO0FBQUE7QUFBQSxLQUVULGFBQWEsQ0FBQztBQUFBLEtBQ2QsVUFBVSxDQUFDO0FBQUE7QUFBQTtBQUtmLFFBQU0sVUFBVSxNQUFNLFNBQVMsT0FBTyxNQUFNO0FBQUEsSUFDM0MsUUFBUTtBQUFBLElBQ1IsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsV0FBVztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sYUFBYTtBQUFBLElBQ2IsWUFBWTtBQUFBLElBQ1osZUFBZTtBQUFBLEVBQ2hCLENBQUM7QUFHRCxvQkFBa0JILE1BQUssVUFBVSxVQUFVLEdBQUc7QUFBQSxJQUM3QyxPQUFPO0FBQUEsRUFDUixDQUFDLEVBQUUsTUFBTSxPQUFPO0FBQ2pCO0FBR0EsU0FBUyxnQkFBZ0I7QUFDeEIsT0FBSyxRQUFRLENBQUMsTUFBTTtBQUVuQixVQUFNLE1BQU0sRUFBRSxPQUNaLFFBQVEsTUFBTSxFQUFFLEVBQ2hCLFFBQVEsU0FBUyxFQUFFLEVBQ25CLE1BQU0sR0FBRyxFQUNULE9BQU8sT0FBTyxFQUNkLElBQUksT0FBTztBQUdiLGFBQVMsS0FBSyxHQUFRLEdBQVc7QUFDaEMsWUFBTSxJQUFJLElBQUksQ0FBQztBQUVmLFVBQUksR0FBRztBQUVOLFlBQUksSUFBSSxJQUFJLENBQUMsR0FBRztBQUNmLGNBQUksQ0FBQyxFQUFFLENBQUMsR0FBRztBQUNWLGNBQUUsQ0FBQyxJQUFJLENBQUM7QUFBQSxVQUNUO0FBRUEsZUFBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFBQSxRQUNqQixPQUFPO0FBRU4sY0FBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHO0FBQ1YsY0FBRSxDQUFDLElBQUk7QUFBQSxjQUNOLFdBQVcsRUFBRSxPQUFPLFVBQVUsR0FBRyxFQUFFLE9BQU8sTUFBTTtBQUFBLGNBQ2hELFlBQVksQ0FBQztBQUFBLFlBQ2Q7QUFBQSxVQUNEO0FBR0EsWUFBRSxJQUFJLFFBQVEsQ0FBQyxNQUFNO0FBRXBCLGdCQUFJLElBQUksRUFBRSxLQUFLLFFBQVEsS0FBSyxFQUFFO0FBRTlCLGdCQUFJLEdBQUc7QUFFTixrQkFBSSxFQUFFLFNBQVMsSUFBSSxHQUFHO0FBQ3JCLGtCQUFFLE9BQU8sRUFBRSxLQUFLLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDN0Isb0JBQUksRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO0FBQUEsY0FDcEI7QUFFQSxnQkFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJO0FBQUEsWUFDWDtBQUFBLFVBQ0QsQ0FBQztBQUdELG1CQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDQyxPQUFNO0FBQzdCLGNBQUUsQ0FBQyxFQUFFLFdBQVdBLEVBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFVBQVUsUUFBUSxVQUFVLEVBQUUsQ0FBQyxJQUFJQSxFQUFDLEdBQUc7QUFBQSxjQUNuRTtBQUFBLGNBQ0E7QUFBQSxZQUNEO0FBQUEsVUFDRCxDQUFDO0FBQUEsUUFDRjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBRUEsU0FBSyxTQUFTLENBQUM7QUFBQSxFQUNoQixDQUFDO0FBQ0Y7QUFHQSxlQUFzQixVQUFVLE9BQXlCO0FBRXhELFFBQU0sUUFBUSxPQUFPLFFBQVEsQ0FBQyxDQUFDO0FBRy9CLGdCQUFjO0FBR2QsWUFBVSxRQUFRO0FBR2xCLGFBQVc7QUFHWCxpQkFBZSxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBRWhDLFNBQU87QUFBQSxJQUNOO0FBQUEsSUFDQTtBQUFBLEVBQ0Q7QUFDRDs7O0FFeGI4VSxTQUFTLHFCQUFBSSwwQkFBeUI7QUFDaFgsT0FBT0MsZUFBYztBQUNyQixTQUFTLFFBQUFDLGFBQVk7QUFJckIsZUFBc0IsV0FBVyxTQUE2QztBQUU3RSxRQUFNLFVBQVUsTUFBTUMsVUFBUyxPQUFPLFFBQVEsTUFBTTtBQUFBLElBQ25ELFFBQVE7QUFBQSxJQUNSLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLFdBQVc7QUFBQSxJQUNYLE1BQU07QUFBQSxJQUNOLG9CQUFvQjtBQUFBLElBQ3BCLGFBQWE7QUFBQSxJQUNiLFlBQVk7QUFBQSxJQUNaLGVBQWU7QUFBQSxFQUNoQixDQUFDO0FBR0QsUUFBTSxPQUFPLFFBQVEsWUFBWSxJQUFJLE1BQU0sR0FBRztBQUc5QyxRQUFNLFFBQVEsSUFBSSxJQUFJO0FBR3RCLFFBQU1DLFFBQU8sT0FBTyxTQUFTLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtBQUc1QyxFQUFBQyxtQkFBa0JDLE1BQUtGLE9BQU0sU0FBUyxNQUFNLEdBQUc7QUFBQSxJQUM5QyxPQUFPO0FBQUEsRUFDUixDQUFDLEVBQUUsTUFBTSxPQUFPO0FBQ2pCOzs7QUMxQk8sU0FBUyxPQUFlO0FBQzlCLFNBQU87QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULGdCQUFnQixRQUFRO0FBQ3ZCLGFBQU8sWUFBWSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7QUFDaEQsaUJBQVMsS0FBSyxNQUFXO0FBQ3hCLGNBQUksVUFBVSxLQUFLLEVBQUUsZ0JBQWdCLDBCQUEwQixDQUFDO0FBQ2hFLGNBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUFDO0FBQUEsUUFDN0I7QUFFQSxZQUFJLElBQUksS0FBSyxTQUFTLFFBQVEsR0FBRztBQUNoQyxnQkFBTSxPQUFPLE1BQU0sVUFBVSxHQUFHO0FBRWhDLGtCQUFRLElBQUksS0FBSztBQUFBLFlBRWhCLEtBQUs7QUFDSixvQkFBTSxXQUFXLElBQUk7QUFDckI7QUFBQSxZQUdELEtBQUs7QUFDSixvQkFBTSxVQUFVLElBQUk7QUFDcEI7QUFBQSxZQUVEO0FBQ0MscUJBQU8sS0FBSztBQUFBLGdCQUNYLE1BQU07QUFBQSxnQkFDTixTQUFTO0FBQUEsY0FDVixDQUFDO0FBQUEsVUFDSDtBQUVBLGVBQUs7QUFBQSxZQUNKLE1BQU07QUFBQSxVQUNQLENBQUM7QUFBQSxRQUNGLE9BQU87QUFDTixlQUFLO0FBQUEsUUFDTjtBQUFBLE1BQ0QsQ0FBQztBQUFBLElBQ0Y7QUFBQSxJQUNBLFVBQVUsTUFBTSxJQUFJO0FBQ25CLGFBQU8sVUFBVSxNQUFNLEVBQUU7QUFBQSxJQUMxQjtBQUFBLElBQ0EsbUJBQW1CLE1BQU07QUFDeEIsYUFBTyxVQUFVLElBQUk7QUFBQSxJQUN0QjtBQUFBLEVBQ0Q7QUFDRDs7O0FDdERvVixPQUFPRyxTQUFRO0FBRTVWLFNBQVMsZUFBZTtBQUM5QixNQUFJLE9BQWlCLENBQUM7QUFFdEIsTUFBSTtBQUNILFdBQU9DLElBQUcsWUFBWSxlQUFlO0FBQ3JDLFdBQU8sS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUM7QUFBQSxFQUMzQyxTQUFTLEtBQUs7QUFBQSxFQUFDO0FBRWYsU0FBTyxFQUFFLEtBQUs7QUFDZjs7O0FDUE8sU0FBUyxVQUFrQjtBQUNqQyxRQUFNLG1CQUFtQixDQUFDLGVBQWUsZ0JBQWdCO0FBR3pELFlBQVU7QUFFVixTQUFPO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxnQkFBZ0IsUUFBUTtBQUN2QixhQUFPLFlBQVksSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO0FBRWhELFlBQUksSUFBSSxPQUFPLGlCQUFpQjtBQUUvQiwyQkFBaUIsUUFBUSxDQUFDLE9BQU87QUFDaEMsa0JBQU0sTUFBTSxPQUFPLFlBQVksY0FBYyxLQUFLLEVBQUUsRUFBRTtBQUV0RCxnQkFBSSxLQUFLO0FBQ1IscUJBQU8sWUFBWSxpQkFBaUIsR0FBRztBQUFBLFlBQ3hDO0FBQUEsVUFDRCxDQUFDO0FBQUEsUUFDRjtBQUVBLGFBQUs7QUFBQSxNQUNOLENBQUM7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNLGdCQUFnQixFQUFFLE1BQU0sT0FBTyxHQUFHO0FBRXZDLFVBQUksQ0FBQyxLQUFLLFNBQVMsaUJBQWlCLEdBQUc7QUFDdEMsY0FBTSxFQUFFLFNBQUFDLFNBQVEsSUFBSSxNQUFNLFVBQVU7QUFHcEMsZUFBTyxHQUFHLEtBQUs7QUFBQSxVQUNkLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxZQUNMLFNBQUFBO0FBQUEsVUFDRDtBQUFBLFFBQ0QsQ0FBQztBQUFBLE1BQ0Y7QUFBQSxJQUNEO0FBQUEsSUFDQSxVQUFVLElBQUk7QUFDYixVQUFJLGlCQUFpQixTQUFTLEVBQUUsR0FBRztBQUNsQyxlQUFPLE9BQU87QUFBQSxNQUNmO0FBQUEsSUFDRDtBQUFBLElBQ0EsTUFBTSxLQUFLLElBQUk7QUFDZCxVQUFJLE9BQU8saUJBQWlCO0FBQzNCLGNBQU0sRUFBRSxTQUFBQSxTQUFRLElBQUksTUFBTSxVQUFVO0FBRXBDLGVBQU87QUFBQSwwQkFDZSxLQUFLLFVBQVUsRUFBRSxTQUFBQSxTQUFRLENBQUMsQ0FBQztBQUFBO0FBQUEsTUFFbEQ7QUFFQSxVQUFJLE9BQU8sb0JBQW9CO0FBQzlCLGNBQU0sRUFBRSxLQUFLLElBQUksYUFBYTtBQUU5QixlQUFPO0FBQUEsMkJBQ2dCLEtBQUssVUFBVSxJQUFJLENBQUM7QUFBQTtBQUFBLE1BRTVDO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFDRDs7O0FDbkVBLFNBQVMsWUFBWTtBQUNyQixPQUFPLFVBQVU7QUFDakIsU0FBUyxnQkFBQUMscUJBQW9CO0FBRXRCLFNBQVMsS0FBSyxRQUEwQjtBQUM5QyxRQUFNLG1CQUFtQixDQUFDLGNBQWM7QUFFeEMsU0FBTztBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsVUFBVSxJQUFJO0FBQ2IsVUFBSSxpQkFBaUIsU0FBUyxFQUFFLEdBQUc7QUFDbEMsZUFBTyxPQUFPO0FBQUEsTUFDZjtBQUFBLElBQ0Q7QUFBQSxJQUNBLE1BQU0sS0FBSyxJQUFJO0FBQ2QsVUFBSSxPQUFPLGtCQUFrQjtBQUM1QixjQUFNQyxRQUFPLENBQUM7QUFFZCxZQUFJLFFBQVE7QUFDWCxnQkFBTSxRQUFRLE1BQU0sS0FBSywrQ0FBK0M7QUFBQSxZQUN2RSxNQUFNO0FBQUEsWUFDTixlQUFlO0FBQUEsVUFDaEIsQ0FBQztBQUVELHFCQUFXLFFBQVEsT0FBTztBQUN6QixnQkFBSSxLQUFLLE9BQU8sR0FBRztBQUNsQixvQkFBTSxJQUFJLEtBQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBRXhDLGNBQUFBLE1BQ0MsRUFDRSxRQUFRLE9BQU8sR0FBRyxFQUNsQixNQUFNLHlDQUF5QyxFQUFFLENBQUMsQ0FDckQsSUFBSUMsY0FBYSxHQUFHLE9BQU87QUFBQSxZQUM1QjtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBRUEsZUFBTztBQUFBLDJCQUNnQixLQUFLLFVBQVVELEtBQUksQ0FBQztBQUFBO0FBQUEsTUFFNUM7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUNEOzs7QUN6Q08sU0FBUyxLQUFLLE1BQWdCO0FBQ3BDLFNBQU87QUFBQTtBQUFBLElBRU4sS0FBSztBQUFBO0FBQUEsSUFFTCxRQUFRO0FBQUE7QUFBQSxJQUVSLEtBQUssSUFBSTtBQUFBLEVBQ1Y7QUFDRDs7O0FaYkEsSUFBTUUsb0NBQW1DO0FBU3pDLFNBQVMsUUFBUSxLQUFhO0FBQzdCLFNBQU9DLE1BQUssUUFBUUMsbUNBQVcsS0FBSyxHQUFHO0FBQ3hDO0FBRUEsU0FBUyxNQUFNLE1BQW1DO0FBQ2pELFNBQU8sU0FBUztBQUNqQjtBQUdBLElBQU8sc0JBQVEsQ0FBQyxFQUFFLEtBQUssTUFBNkI7QUFDbkQsU0FBTztBQUFBLElBQ04sU0FBUztBQUFBLE1BQ1IsSUFBSTtBQUFBLE1BQ0osWUFBWTtBQUFBLE1BQ1osT0FBTztBQUFBLE1BQ1AsS0FBSyxLQUFLO0FBQUE7QUFBQSxNQUNWLFdBQVc7QUFBQSxRQUNWLE1BQU07QUFBQSxRQUNOLFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxNQUNiLENBQUM7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTjtBQUFBLE1BQ0EsS0FBSztBQUFBLFFBQ0osU0FBUztBQUFBLE1BQ1Y7QUFBQSxJQUNEO0FBQUEsSUFDQSxLQUFLO0FBQUEsTUFDSixxQkFBcUI7QUFBQSxRQUNwQixNQUFNO0FBQUEsVUFDTCxTQUFTO0FBQUEsUUFDVjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUixPQUFPO0FBQUEsUUFDTixNQUFNLFFBQVEsS0FBSztBQUFBLFFBQ25CLE1BQU0sUUFBUSxhQUFhO0FBQUEsUUFDM0IsTUFBTSxRQUFRLGFBQWE7QUFBQSxRQUMzQixNQUFNLFFBQVEsVUFBVTtBQUFBLE1BQ3pCO0FBQUEsSUFDRDtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1IsTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLFVBQVU7QUFBQSxJQUNoRDtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ04sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BT1IsV0FBVyxNQUFNLElBQUk7QUFBQSxNQUNyQixlQUFlO0FBQUEsUUFDZCxRQUFRO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixnQkFBZ0I7QUFBQSxVQUNoQixnQkFBZ0I7QUFBQSxVQUNoQixhQUFhLElBQUk7QUFDaEIsZ0JBQUksR0FBRyxTQUFTLGNBQWMsR0FBRztBQUNoQyxrQkFBSSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHO0FBQ3BELG9CQUFJLE1BQU0sR0FBRyxTQUFTLEVBQUUsTUFBTSxlQUFlLEVBQUUsQ0FBQztBQUVoRCxvQkFBSSxJQUFJLENBQUMsS0FBSyxLQUFLO0FBQ2xCLHdCQUFNLElBQUksUUFBUSxLQUFLLEdBQUc7QUFBQSxnQkFDM0I7QUFFQSx1QkFBTyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxTQUFTO0FBQUEsY0FDbkM7QUFBQSxZQUNEO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFDRDsiLAogICJuYW1lcyI6IFsicGF0aCIsICJwYXRoIiwgIl8iLCAicGF0aCIsICJyZXNvbHZlIiwgImVycm9yIiwgImpvaW4iLCAiam9pbiIsICJqb2luIiwgImpvaW4iLCAiZSIsICJsaXN0IiwgInNlcnZpY2UiLCAiYSIsICJjcmVhdGVXcml0ZVN0cmVhbSIsICJwcmV0dGllciIsICJqb2luIiwgInByZXR0aWVyIiwgInBhdGgiLCAiY3JlYXRlV3JpdGVTdHJlYW0iLCAiam9pbiIsICJmcyIsICJmcyIsICJzZXJ2aWNlIiwgInJlYWRGaWxlU3luYyIsICJkZW1vIiwgInJlYWRGaWxlU3luYyIsICJfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSIsICJwYXRoIiwgIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIl0KfQo=
